using Hangfire.States; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using OpenIddict.Abstractions; using OpenIddict.Server.AspNetCore; using Shentun.Peis.Models; using Shentun.Peis.ThirdUsers; using System; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Domain.Repositories; using Volo.Abp.Identity; using Volo.Abp.OpenIddict.Controllers; using Volo.Abp.Uow; namespace Shentun.Peis.Controllers { /// /// 小程序登录 /// [Route("/connect/token", Order = -1)] public class MiniProgramTokenController : TokenController { private readonly IConfiguration _configuration; private readonly IRepository _thirdUserRepository; private readonly SignInManager _signInManager; private readonly IRepository _identityUserRepository; public MiniProgramTokenController( IConfiguration configuration, IRepository thirdUserRepository, SignInManager signInManager, IRepository identityUserRepository) { _configuration = configuration; _thirdUserRepository = thirdUserRepository; _signInManager = signInManager; _identityUserRepository = identityUserRepository; } public override async Task HandleAsync() { //MiniProgram var request = await GetOpenIddictServerRequestAsync(HttpContext); string grantType = request.GrantType; if (grantType == "mini_program") { var resultDto = new ThirdLoginDto(); //小程序登录 // 获取小程序 code 并换取 openid var jsCode = request.GetParameter("jsCode").ToString(); var mobilePhone = request.GetParameter("mobile_phone").ToString(); var wechatSession = await WeChatHelper.GetWechatSession(_configuration, jsCode); var thirdUserEnt = await _thirdUserRepository.FirstOrDefaultAsync(f => f.WechatOpenId == wechatSession.OpenId); if (thirdUserEnt == null) { //未注册 注册信息 thirdUserEnt = new ThirdUser { AbpUserId = null, IsActive = 'Y', MobilePhone = mobilePhone, UserRegisterFlag = '0', WechatOpenId = wechatSession.OpenId }; await _thirdUserRepository.InsertAsync(thirdUserEnt, true); resultDto = new ThirdLoginDto { IsToken = "N", Message = "用户未授权", OpenId = wechatSession.OpenId }; return Ok(resultDto); } else if (thirdUserEnt.IsActive == 'N') { resultDto = new ThirdLoginDto { IsToken = "N", Message = "用户被禁用", OpenId = wechatSession.OpenId }; return Ok(resultDto); } else if (thirdUserEnt.AbpUserId == null) { resultDto = new ThirdLoginDto { IsToken = "N", Message = "用户未授权", OpenId = wechatSession.OpenId }; return Ok(resultDto); } // 查询关联的 AbpUser var abpUser = await _identityUserRepository.FirstOrDefaultAsync(f => f.Id == thirdUserEnt.AbpUserId); if (abpUser == null) { resultDto = new ThirdLoginDto { IsToken = "N", Message = "用户未关联权限", OpenId = wechatSession.OpenId }; return Ok(resultDto); } // 生成声明主体 var principal = await _signInManager.CreateUserPrincipalAsync(abpUser); var scopes = request.GetScopes(); var resources = await GetResourcesAsync(scopes); principal.SetScopes(scopes); principal.SetResources(resources); await SetClaimsDestinationsAsync(principal); return SignIn(principal, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); } //else if (grantType == "phone_verify") //{ // //手机号+验证码登录认证 // var mobilePhone = request.GetParameter("mobilePhone").ToString(); // var verifyCode = request.GetParameter("verifyCode").ToString(); // var thirdUserEnt = await _thirdUserRepository.FirstOrDefaultAsync(f => f.MobilePhone == mobilePhone && f.IsActive == 'Y' && f.AbpUserId != null); // if (thirdUserEnt == null) // { // throw new UserFriendlyException("用户未授权"); // } // // 查询关联的 AbpUser // var abpUser = await _identityUserRepository.FirstOrDefaultAsync(f => f.Id == thirdUserEnt.AbpUserId); // if (abpUser == null) // { // throw new UserFriendlyException("用户未关联权限"); // } // // 生成声明主体 // var principal = await _signInManager.CreateUserPrincipalAsync(abpUser); // var scopes = request.GetScopes(); // var resources = await GetResourcesAsync(scopes); // principal.SetScopes(scopes); // principal.SetResources(resources); // await SetClaimsDestinationsAsync(principal); // return SignIn(principal, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); //} else { return await base.HandleAsync(); } } } }