From a316422a7440d4222627337be737a3d8dece0eca Mon Sep 17 00:00:00 2001 From: sassassin <530521314@qq.com> Date: Mon, 13 Sep 2021 08:06:20 +0800 Subject: [PATCH 1/4] Add miniprogram module to pearadmin.abp --- PearAdmin.AbpTemplate.sln | 14 + .../AbpTemplateExternalAuthModule.cs | 14 + .../ExternalAuthConfiguration.cs | 15 + .../ExternalAuthManager.cs | 41 +++ .../ExternalAuthProviderApiBase.cs | 22 ++ .../ExternalAuthUserInfo.cs | 15 + .../ExternalLoginProviderInfo.cs | 27 ++ .../IExternalAuthConfiguration.cs | 9 + .../IExternalAuthManager.cs | 11 + .../IExternalAuthProviderApi.cs | 15 + .../IExternalLoginInfoProvider.cs | 9 + .../PearAdmin.AbpTemplate.ExternalAuth.csproj | 12 + .../AbpTemplateMiniProgramModule.cs | 14 + .../Enums/RequestErrorCodeEnum.cs | 11 + .../MiniProgramAuthProviderApi.cs | 99 ++++++ .../MiniProgramExternalLoginInfoProvider.cs | 27 ++ .../MiniProgramSessionKey.cs | 9 + .../MiniProgramUserInfo.cs | 14 + .../PearAdmin.AbpTemplate.MiniProgram.csproj | 18 ++ .../AbpTemplateAdminModule.cs | 22 +- .../Controllers/AccountController.cs | 292 ++++-------------- .../Account/ExternalAuthenticateModel.cs | 11 + .../Models/Account/RegisterResultViewModel.cs | 19 -- .../PearAdmin.AbpTemplate.Admin.csproj | 1 + .../Properties/launchSettings.json | 3 +- src/PearAdmin.AbpTemplate.Admin/Startup.cs | 2 - .../appsettings.json | 7 + 27 files changed, 494 insertions(+), 259 deletions(-) create mode 100644 module/PearAdmin.AbpTemplate.ExternalAuth/AbpTemplateExternalAuthModule.cs create mode 100644 module/PearAdmin.AbpTemplate.ExternalAuth/ExternalAuthConfiguration.cs create mode 100644 module/PearAdmin.AbpTemplate.ExternalAuth/ExternalAuthManager.cs create mode 100644 module/PearAdmin.AbpTemplate.ExternalAuth/ExternalAuthProviderApiBase.cs create mode 100644 module/PearAdmin.AbpTemplate.ExternalAuth/ExternalAuthUserInfo.cs create mode 100644 module/PearAdmin.AbpTemplate.ExternalAuth/ExternalLoginProviderInfo.cs create mode 100644 module/PearAdmin.AbpTemplate.ExternalAuth/IExternalAuthConfiguration.cs create mode 100644 module/PearAdmin.AbpTemplate.ExternalAuth/IExternalAuthManager.cs create mode 100644 module/PearAdmin.AbpTemplate.ExternalAuth/IExternalAuthProviderApi.cs create mode 100644 module/PearAdmin.AbpTemplate.ExternalAuth/IExternalLoginInfoProvider.cs create mode 100644 module/PearAdmin.AbpTemplate.ExternalAuth/PearAdmin.AbpTemplate.ExternalAuth.csproj create mode 100644 module/PearAdmin.AbpTemplate.MiniProgram/AbpTemplateMiniProgramModule.cs create mode 100644 module/PearAdmin.AbpTemplate.MiniProgram/Enums/RequestErrorCodeEnum.cs create mode 100644 module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramAuthProviderApi.cs create mode 100644 module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramExternalLoginInfoProvider.cs create mode 100644 module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramSessionKey.cs create mode 100644 module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramUserInfo.cs create mode 100644 module/PearAdmin.AbpTemplate.MiniProgram/PearAdmin.AbpTemplate.MiniProgram.csproj create mode 100644 src/PearAdmin.AbpTemplate.Admin/Models/Account/ExternalAuthenticateModel.cs delete mode 100644 src/PearAdmin.AbpTemplate.Admin/Models/Account/RegisterResultViewModel.cs diff --git a/PearAdmin.AbpTemplate.sln b/PearAdmin.AbpTemplate.sln index d12370d..6c2bea4 100644 --- a/PearAdmin.AbpTemplate.sln +++ b/PearAdmin.AbpTemplate.sln @@ -39,6 +39,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PearAdmin.AbpTemplate.Stora EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PearAdmin.AbpTemplate.NLog", "module\PearAdmin.AbpTemplate.NLog\PearAdmin.AbpTemplate.NLog.csproj", "{9AFB01E8-783F-472E-90D6-F2A8AD6120FF}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PearAdmin.AbpTemplate.MiniProgram", "module\PearAdmin.AbpTemplate.MiniProgram\PearAdmin.AbpTemplate.MiniProgram.csproj", "{A285A2DC-3435-48A4-B005-D47710AA351D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PearAdmin.AbpTemplate.ExternalAuth", "module\PearAdmin.AbpTemplate.ExternalAuth\PearAdmin.AbpTemplate.ExternalAuth.csproj", "{B55DAA71-4958-485D-8888-E185C2104931}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -101,6 +105,14 @@ Global {9AFB01E8-783F-472E-90D6-F2A8AD6120FF}.Debug|Any CPU.Build.0 = Debug|Any CPU {9AFB01E8-783F-472E-90D6-F2A8AD6120FF}.Release|Any CPU.ActiveCfg = Release|Any CPU {9AFB01E8-783F-472E-90D6-F2A8AD6120FF}.Release|Any CPU.Build.0 = Release|Any CPU + {A285A2DC-3435-48A4-B005-D47710AA351D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A285A2DC-3435-48A4-B005-D47710AA351D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A285A2DC-3435-48A4-B005-D47710AA351D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A285A2DC-3435-48A4-B005-D47710AA351D}.Release|Any CPU.Build.0 = Release|Any CPU + {B55DAA71-4958-485D-8888-E185C2104931}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B55DAA71-4958-485D-8888-E185C2104931}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B55DAA71-4958-485D-8888-E185C2104931}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B55DAA71-4958-485D-8888-E185C2104931}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -120,6 +132,8 @@ Global {F17AF2E0-E290-43A6-8695-B653FA6446EE} = {AFAA0841-BD93-466F-B8F4-FB4EEC86F1FC} {91E47E05-561D-42C2-AFB8-2F567185E177} = {A9CEE774-07BE-415D-935C-D42562C045F9} {9AFB01E8-783F-472E-90D6-F2A8AD6120FF} = {A9CEE774-07BE-415D-935C-D42562C045F9} + {A285A2DC-3435-48A4-B005-D47710AA351D} = {A9CEE774-07BE-415D-935C-D42562C045F9} + {B55DAA71-4958-485D-8888-E185C2104931} = {A9CEE774-07BE-415D-935C-D42562C045F9} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C6B33810-FA59-48A3-9DC4-F1F0312C57F6} diff --git a/module/PearAdmin.AbpTemplate.ExternalAuth/AbpTemplateExternalAuthModule.cs b/module/PearAdmin.AbpTemplate.ExternalAuth/AbpTemplateExternalAuthModule.cs new file mode 100644 index 0000000..7a569e7 --- /dev/null +++ b/module/PearAdmin.AbpTemplate.ExternalAuth/AbpTemplateExternalAuthModule.cs @@ -0,0 +1,14 @@ +using Abp; +using Abp.Modules; + +namespace PearAdmin.AbpTemplate.ExternalAuth +{ + [DependsOn(typeof(AbpKernelModule))] + public class AbpTemplateExternalAuthModule : AbpModule + { + public override void Initialize() + { + IocManager.RegisterAssemblyByConvention(typeof(AbpTemplateExternalAuthModule).Assembly); + } + } +} diff --git a/module/PearAdmin.AbpTemplate.ExternalAuth/ExternalAuthConfiguration.cs b/module/PearAdmin.AbpTemplate.ExternalAuth/ExternalAuthConfiguration.cs new file mode 100644 index 0000000..768743d --- /dev/null +++ b/module/PearAdmin.AbpTemplate.ExternalAuth/ExternalAuthConfiguration.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using Abp.Dependency; + +namespace PearAdmin.AbpTemplate.ExternalAuth +{ + public class ExternalAuthConfiguration : IExternalAuthConfiguration, ISingletonDependency + { + public List Providers { get; } + + public ExternalAuthConfiguration() + { + Providers = new List(); + } + } +} diff --git a/module/PearAdmin.AbpTemplate.ExternalAuth/ExternalAuthManager.cs b/module/PearAdmin.AbpTemplate.ExternalAuth/ExternalAuthManager.cs new file mode 100644 index 0000000..72c52f1 --- /dev/null +++ b/module/PearAdmin.AbpTemplate.ExternalAuth/ExternalAuthManager.cs @@ -0,0 +1,41 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using Abp.Dependency; + +namespace PearAdmin.AbpTemplate.ExternalAuth +{ + public class ExternalAuthManager : IExternalAuthManager, ITransientDependency + { + private readonly IIocResolver _iocResolver; + private readonly IExternalAuthConfiguration _externalAuthConfiguration; + + public ExternalAuthManager(IIocResolver iocResolver, IExternalAuthConfiguration externalAuthConfiguration) + { + _iocResolver = iocResolver; + _externalAuthConfiguration = externalAuthConfiguration; + } + + public Task IsValidUser(string provider, string providerKey, string providerAccessCode) + { + using (IDisposableDependencyObjectWrapper providerApi = CreateProviderApi(provider)) + return providerApi.Object.IsValidUser(providerKey, providerAccessCode); + } + + public Task GetUserInfo(string provider, string accessCode) + { + using (IDisposableDependencyObjectWrapper providerApi = CreateProviderApi(provider)) + return providerApi.Object.GetUserInfo(accessCode); + } + + public IDisposableDependencyObjectWrapper CreateProviderApi(string provider) + { + var providerInfo = _externalAuthConfiguration.Providers.Single(infoProvider => infoProvider.Name == provider).GetExternalLoginInfo(); + if (providerInfo == null) + throw new Exception("Unknown external auth provider: " + provider); + IDisposableDependencyObjectWrapper dependencyObjectWrapper = IocResolverExtensions.ResolveAsDisposable(_iocResolver, providerInfo.ProviderApiType); + dependencyObjectWrapper.Object.Initialize(providerInfo); + return dependencyObjectWrapper; + } + } +} diff --git a/module/PearAdmin.AbpTemplate.ExternalAuth/ExternalAuthProviderApiBase.cs b/module/PearAdmin.AbpTemplate.ExternalAuth/ExternalAuthProviderApiBase.cs new file mode 100644 index 0000000..4cc820a --- /dev/null +++ b/module/PearAdmin.AbpTemplate.ExternalAuth/ExternalAuthProviderApiBase.cs @@ -0,0 +1,22 @@ +using System.Threading.Tasks; +using Abp.Dependency; + +namespace PearAdmin.AbpTemplate.ExternalAuth +{ + public abstract class ExternalAuthProviderApiBase : IExternalAuthProviderApi, ITransientDependency + { + public ExternalLoginProviderInfo ProviderInfo { get; set; } + + public virtual void Initialize(ExternalLoginProviderInfo providerInfo) + { + ProviderInfo = providerInfo; + } + + public async Task IsValidUser(string userId, string accessCode) + { + return (await GetUserInfo(accessCode)).ProviderKey == userId; + } + + public abstract Task GetUserInfo(string accessCode); + } +} diff --git a/module/PearAdmin.AbpTemplate.ExternalAuth/ExternalAuthUserInfo.cs b/module/PearAdmin.AbpTemplate.ExternalAuth/ExternalAuthUserInfo.cs new file mode 100644 index 0000000..6582e62 --- /dev/null +++ b/module/PearAdmin.AbpTemplate.ExternalAuth/ExternalAuthUserInfo.cs @@ -0,0 +1,15 @@ +namespace PearAdmin.AbpTemplate.ExternalAuth +{ + public class ExternalAuthUserInfo + { + public string ProviderKey { get; set; } + + public string Name { get; set; } + + public string EmailAddress { get; set; } + + public string Surname { get; set; } + + public string Provider { get; set; } + } +} diff --git a/module/PearAdmin.AbpTemplate.ExternalAuth/ExternalLoginProviderInfo.cs b/module/PearAdmin.AbpTemplate.ExternalAuth/ExternalLoginProviderInfo.cs new file mode 100644 index 0000000..7ea9729 --- /dev/null +++ b/module/PearAdmin.AbpTemplate.ExternalAuth/ExternalLoginProviderInfo.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace PearAdmin.AbpTemplate.ExternalAuth +{ + public class ExternalLoginProviderInfo + { + public string Name { get; set; } + + public string ClientId { get; set; } + + public string ClientSecret { get; set; } + + public Type ProviderApiType { get; set; } + + public Dictionary AdditionalParams { get; set; } + + public ExternalLoginProviderInfo(string name, string clientId, string clientSecret, Type providerApiType, Dictionary additionalParams = null) + { + Name = name; + ClientId = clientId; + ClientSecret = clientSecret; + ProviderApiType = providerApiType; + AdditionalParams = additionalParams ?? new Dictionary(); + } + } +} diff --git a/module/PearAdmin.AbpTemplate.ExternalAuth/IExternalAuthConfiguration.cs b/module/PearAdmin.AbpTemplate.ExternalAuth/IExternalAuthConfiguration.cs new file mode 100644 index 0000000..8635718 --- /dev/null +++ b/module/PearAdmin.AbpTemplate.ExternalAuth/IExternalAuthConfiguration.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace PearAdmin.AbpTemplate.ExternalAuth +{ + public interface IExternalAuthConfiguration + { + List Providers { get; } + } +} diff --git a/module/PearAdmin.AbpTemplate.ExternalAuth/IExternalAuthManager.cs b/module/PearAdmin.AbpTemplate.ExternalAuth/IExternalAuthManager.cs new file mode 100644 index 0000000..1b9015e --- /dev/null +++ b/module/PearAdmin.AbpTemplate.ExternalAuth/IExternalAuthManager.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; + +namespace PearAdmin.AbpTemplate.ExternalAuth +{ + public interface IExternalAuthManager + { + Task IsValidUser(string provider, string providerKey, string providerAccessCode); + + Task GetUserInfo(string provider, string accessCode); + } +} diff --git a/module/PearAdmin.AbpTemplate.ExternalAuth/IExternalAuthProviderApi.cs b/module/PearAdmin.AbpTemplate.ExternalAuth/IExternalAuthProviderApi.cs new file mode 100644 index 0000000..0d646fb --- /dev/null +++ b/module/PearAdmin.AbpTemplate.ExternalAuth/IExternalAuthProviderApi.cs @@ -0,0 +1,15 @@ +using System.Threading.Tasks; + +namespace PearAdmin.AbpTemplate.ExternalAuth +{ + public interface IExternalAuthProviderApi + { + ExternalLoginProviderInfo ProviderInfo { get; } + + Task IsValidUser(string userId, string accessCode); + + Task GetUserInfo(string accessCode); + + void Initialize(ExternalLoginProviderInfo providerInfo); + } +} \ No newline at end of file diff --git a/module/PearAdmin.AbpTemplate.ExternalAuth/IExternalLoginInfoProvider.cs b/module/PearAdmin.AbpTemplate.ExternalAuth/IExternalLoginInfoProvider.cs new file mode 100644 index 0000000..ae6744a --- /dev/null +++ b/module/PearAdmin.AbpTemplate.ExternalAuth/IExternalLoginInfoProvider.cs @@ -0,0 +1,9 @@ +namespace PearAdmin.AbpTemplate.ExternalAuth +{ + public interface IExternalLoginInfoProvider + { + string Name { get; } + + ExternalLoginProviderInfo GetExternalLoginInfo(); + } +} diff --git a/module/PearAdmin.AbpTemplate.ExternalAuth/PearAdmin.AbpTemplate.ExternalAuth.csproj b/module/PearAdmin.AbpTemplate.ExternalAuth/PearAdmin.AbpTemplate.ExternalAuth.csproj new file mode 100644 index 0000000..a8e3113 --- /dev/null +++ b/module/PearAdmin.AbpTemplate.ExternalAuth/PearAdmin.AbpTemplate.ExternalAuth.csproj @@ -0,0 +1,12 @@ + + + + 1.0.0.0 + net5.0 + + + + + + + diff --git a/module/PearAdmin.AbpTemplate.MiniProgram/AbpTemplateMiniProgramModule.cs b/module/PearAdmin.AbpTemplate.MiniProgram/AbpTemplateMiniProgramModule.cs new file mode 100644 index 0000000..f43b8b6 --- /dev/null +++ b/module/PearAdmin.AbpTemplate.MiniProgram/AbpTemplateMiniProgramModule.cs @@ -0,0 +1,14 @@ +using Abp.Modules; +using PearAdmin.AbpTemplate.ExternalAuth; + +namespace PearAdmin.AbpTemplate.MiniProgram +{ + [DependsOn(typeof(AbpTemplateExternalAuthModule))] + public class AbpTemplateMiniProgramModule : AbpModule + { + public override void Initialize() + { + IocManager.RegisterAssemblyByConvention(typeof(AbpTemplateMiniProgramModule).Assembly); + } + } +} diff --git a/module/PearAdmin.AbpTemplate.MiniProgram/Enums/RequestErrorCodeEnum.cs b/module/PearAdmin.AbpTemplate.MiniProgram/Enums/RequestErrorCodeEnum.cs new file mode 100644 index 0000000..809c0ba --- /dev/null +++ b/module/PearAdmin.AbpTemplate.MiniProgram/Enums/RequestErrorCodeEnum.cs @@ -0,0 +1,11 @@ +namespace PearAdmin.AbpTemplate.MiniProgram.Enums +{ + public enum RequestErrorCodeEnum + { + Busy = -1, + Succeed = 0, + CodeError = 40029, + FrequencyLimit = 45011, + HighRiskUser = 40226 + } +} diff --git a/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramAuthProviderApi.cs b/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramAuthProviderApi.cs new file mode 100644 index 0000000..484afe9 --- /dev/null +++ b/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramAuthProviderApi.cs @@ -0,0 +1,99 @@ +using System; +using System.Threading.Tasks; +using Abp.Runtime.Caching; +using Castle.Core.Logging; +using PearAdmin.AbpTemplate.ExternalAuth; +using PearAdmin.AbpTemplate.MiniProgram.Enums; +using SKIT.FlurlHttpClient.Wechat.Api; +using SKIT.FlurlHttpClient.Wechat.Api.Models; + +namespace PearAdmin.AbpTemplate.MiniProgram +{ + public class MiniProgramAuthProviderApi : ExternalAuthProviderApiBase + { + public const string ProviderName = "WeChatMiniProgram"; + private WechatApiClient _weChatApiClient; + private readonly ILogger _logger; + private readonly ICacheManager _cacheManager; + + public MiniProgramAuthProviderApi(ILogger logger, + ICacheManager cacheManager) + { + _logger = logger; + _cacheManager = cacheManager; + } + + public override void Initialize(ExternalLoginProviderInfo providerInfo) + { + base.Initialize(providerInfo); + _weChatApiClient = new WechatApiClient(new WechatApiClientOptions() + { + AppId = ProviderInfo.ClientId, + AppSecret = ProviderInfo.ClientSecret, + }); + } + + public async override Task GetUserInfo(string accessCode) + { + var miniProgramSessionKey = await GetWeChatUserOpenId(accessCode); + var miniProgramUserInfo = await GetWeChatUserInfo(miniProgramSessionKey); + var externalAuthUserInfo = new ExternalAuthUserInfo + { + EmailAddress = miniProgramUserInfo.OpenId + $"@{ProviderName}.com",//邮箱唯一性 + Surname = miniProgramUserInfo.Nickname, + Name = miniProgramUserInfo.Nickname, + ProviderKey = miniProgramUserInfo.OpenId, + Provider = ProviderName, + }; + + return externalAuthUserInfo; + } + + private async Task GetWeChatUserOpenId(string code) + { + var response = await _weChatApiClient.ExecuteSnsJsCode2SessionAsync(new SnsJsCode2SessionRequest() + { + JsCode = code + }); + + if (response.ErrorCode == (int)RequestErrorCodeEnum.Succeed) + { + return new MiniProgramSessionKey() + { + OpenId = response.OpenId, + SessionKey = response.SessionKey, + UnionId = response.UnionId + }; + } + + return null; + } + + private async Task GetWeChatUserInfo(MiniProgramSessionKey miniProgramSessionKey) + { + //var cgibinTokenResponse = await _weChatApiClient.ExecuteCgibinTokenAsync(new CgibinTokenRequest()); + + var cgibinUserInfoResponse = await _weChatApiClient.ExecuteCgibinUserInfoAsync(new CgibinUserInfoRequest() + { + AccessToken = "49_lEGICP1a2U7giCcBjf5X6Wmkr-zyrN9NKtV7ca6VSn8z7jXf5GEc2T4J0wOGRadVGbeZYsDIHM7Wjo1rubJs6DQ9IczjLYXKefT3DEXEA2UUTrRfy_jLNX1FjbwttfaG5LBubDncG-TwvSXqBYTdAAAURM",//cgibinTokenResponse.AccessToken, + OpenId = miniProgramSessionKey.OpenId + }); + if (!cgibinUserInfoResponse.IsSuccessful()) + { + throw new Exception($"ErrorCode:{cgibinUserInfoResponse.ErrorCode}.Message:{cgibinUserInfoResponse.ErrorMessage}"); + } + + return new MiniProgramUserInfo() + { + Nickname = cgibinUserInfoResponse.Nickname, + OpenId = cgibinUserInfoResponse.OpenId, + Sex = cgibinUserInfoResponse.Sex, + HeadImageUrl = cgibinUserInfoResponse.HeadImageUrl, + Country = cgibinUserInfoResponse.Country, + Province = cgibinUserInfoResponse.Province, + City = cgibinUserInfoResponse.City, + UnionId = cgibinUserInfoResponse.UnionId + }; + } + } +} diff --git a/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramExternalLoginInfoProvider.cs b/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramExternalLoginInfoProvider.cs new file mode 100644 index 0000000..9aefd18 --- /dev/null +++ b/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramExternalLoginInfoProvider.cs @@ -0,0 +1,27 @@ +using PearAdmin.AbpTemplate.ExternalAuth; + +namespace PearAdmin.AbpTemplate.MiniProgram +{ + public class MiniProgramExternalLoginInfoProvider : IExternalLoginInfoProvider + { + public string Name { get; } = "WeChatMiniProgram"; + + protected string ConsumerKey { get; set; } + + protected string ConsumerSecret { get; set; } + + protected ExternalLoginProviderInfo ExternalLoginProviderInfo { get; set; } + + public MiniProgramExternalLoginInfoProvider(string appId, string appSecret) + { + ConsumerKey = appId; + ConsumerSecret = appSecret; + ExternalLoginProviderInfo = new ExternalLoginProviderInfo(Name, ConsumerKey, ConsumerSecret, typeof(MiniProgramAuthProviderApi), null); + } + + public virtual ExternalLoginProviderInfo GetExternalLoginInfo() + { + return ExternalLoginProviderInfo; + } + } +} diff --git a/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramSessionKey.cs b/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramSessionKey.cs new file mode 100644 index 0000000..da3641f --- /dev/null +++ b/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramSessionKey.cs @@ -0,0 +1,9 @@ +namespace PearAdmin.AbpTemplate.MiniProgram +{ + public class MiniProgramSessionKey + { + public string OpenId { get; set; } + public string SessionKey { get; set; } + public string UnionId { get; set; } + } +} diff --git a/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramUserInfo.cs b/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramUserInfo.cs new file mode 100644 index 0000000..a22d1f8 --- /dev/null +++ b/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramUserInfo.cs @@ -0,0 +1,14 @@ +namespace PearAdmin.AbpTemplate.MiniProgram +{ + public class MiniProgramUserInfo + { + public string HeadImageUrl { get; set; } + public string Country { get; set; } + public string Province { get; set; } + public string City { get; set; } + public int Sex { get; set; } + public string Nickname { get; set; } + public string? UnionId { get; set; } + public string OpenId { get; set; } + } +} diff --git a/module/PearAdmin.AbpTemplate.MiniProgram/PearAdmin.AbpTemplate.MiniProgram.csproj b/module/PearAdmin.AbpTemplate.MiniProgram/PearAdmin.AbpTemplate.MiniProgram.csproj new file mode 100644 index 0000000..02dac15 --- /dev/null +++ b/module/PearAdmin.AbpTemplate.MiniProgram/PearAdmin.AbpTemplate.MiniProgram.csproj @@ -0,0 +1,18 @@ + + + + 1.0.0.0 + net5.0 + + + + + + + + + + + + + diff --git a/src/PearAdmin.AbpTemplate.Admin/AbpTemplateAdminModule.cs b/src/PearAdmin.AbpTemplate.Admin/AbpTemplateAdminModule.cs index d56b49e..428976e 100644 --- a/src/PearAdmin.AbpTemplate.Admin/AbpTemplateAdminModule.cs +++ b/src/PearAdmin.AbpTemplate.Admin/AbpTemplateAdminModule.cs @@ -13,7 +13,9 @@ using Microsoft.Extensions.Configuration; using PearAdmin.AbpTemplate.Admin.Configuration; using PearAdmin.AbpTemplate.Admin.Views; using PearAdmin.AbpTemplate.EntityFrameworkCore; +using PearAdmin.AbpTemplate.ExternalAuth; using PearAdmin.AbpTemplate.Gateway; +using PearAdmin.AbpTemplate.MiniProgram; namespace PearAdmin.AbpTemplate.Admin { @@ -23,7 +25,8 @@ namespace PearAdmin.AbpTemplate.Admin typeof(AbpTemplateGatewayModule), typeof(AbpAspNetCoreModule), typeof(AbpAspNetCoreSignalRModule), - typeof(AbpHangfireAspNetCoreModule) + typeof(AbpHangfireAspNetCoreModule), + typeof(AbpTemplateMiniProgramModule) )] public class AbpTemplateAdminModule : AbpModule { @@ -61,6 +64,23 @@ namespace PearAdmin.AbpTemplate.Admin SetAppFolders(); IocManager.Resolve() .AddApplicationPartsIfNotAddedBefore(typeof(AbpTemplateAdminModule).Assembly); + + ConfigureExternalAuthProviders(); + } + + private void ConfigureExternalAuthProviders() + { + var externalAuthConfiguration = IocManager.Resolve(); + + if (bool.Parse(_appConfiguration["Authentication:WeChatMiniProgram:IsEnabled"])) + { + externalAuthConfiguration.Providers.Add( + new MiniProgramExternalLoginInfoProvider( + _appConfiguration["Authentication:WeChatMiniProgram:AppId"], + _appConfiguration["Authentication:WeChatMiniProgram:AppSecret"] + ) + ); + } } public override void Shutdown() diff --git a/src/PearAdmin.AbpTemplate.Admin/Controllers/AccountController.cs b/src/PearAdmin.AbpTemplate.Admin/Controllers/AccountController.cs index 7610156..51bf02e 100644 --- a/src/PearAdmin.AbpTemplate.Admin/Controllers/AccountController.cs +++ b/src/PearAdmin.AbpTemplate.Admin/Controllers/AccountController.cs @@ -1,29 +1,21 @@ using System; using System.Collections.Generic; using System.Diagnostics; -using System.Linq; -using System.Security.Claims; using System.Threading.Tasks; -using Abp; -using Abp.AspNetCore.Mvc.Authorization; using Abp.Authorization; using Abp.Authorization.Users; -using Abp.Configuration; using Abp.Configuration.Startup; using Abp.Domain.Uow; using Abp.Extensions; using Abp.MultiTenancy; using Abp.Notifications; -using Abp.Threading; -using Abp.Timing; -using Abp.UI; using Abp.Web.Models; -using Abp.Zero.Configuration; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using PearAdmin.AbpTemplate.Admin.Models.Account; using PearAdmin.AbpTemplate.Authorization; using PearAdmin.AbpTemplate.Authorization.Users; +using PearAdmin.AbpTemplate.ExternalAuth; using PearAdmin.AbpTemplate.Identity; using PearAdmin.AbpTemplate.MultiTenancy; using PearAdmin.AbpTemplate.Sessions; @@ -43,6 +35,7 @@ namespace PearAdmin.AbpTemplate.Admin.Controllers private readonly ISessionAppService _sessionAppService; private readonly ITenantCache _tenantCache; private readonly INotificationPublisher _notificationPublisher; + private readonly IExternalAuthManager _externalAuthManager; public AccountController( UserManager userManager, @@ -55,7 +48,8 @@ namespace PearAdmin.AbpTemplate.Admin.Controllers UserRegistrationManager userRegistrationManager, ISessionAppService sessionAppService, ITenantCache tenantCache, - INotificationPublisher notificationPublisher) + INotificationPublisher notificationPublisher, + IExternalAuthManager externalAuthManager) { _userManager = userManager; _multiTenancyConfig = multiTenancyConfig; @@ -68,6 +62,7 @@ namespace PearAdmin.AbpTemplate.Admin.Controllers _sessionAppService = sessionAppService; _tenantCache = tenantCache; _notificationPublisher = notificationPublisher; + _externalAuthManager = externalAuthManager; } #region Login / Logout @@ -79,7 +74,7 @@ namespace PearAdmin.AbpTemplate.Admin.Controllers /// /// /// - public ActionResult HostLogin(string userNameOrEmailAddress = "", string returnUrl = "", string successMessage = "") + public ActionResult HostLogin(string returnUrl) { if (string.IsNullOrWhiteSpace(returnUrl)) { @@ -104,7 +99,7 @@ namespace PearAdmin.AbpTemplate.Admin.Controllers /// /// /// - public ActionResult Login(string userNameOrEmailAddress = "", string returnUrl = "", string successMessage = "") + public ActionResult Login(string returnUrl) { if (string.IsNullOrWhiteSpace(returnUrl)) { @@ -124,7 +119,7 @@ namespace PearAdmin.AbpTemplate.Admin.Controllers [HttpPost] [UnitOfWork] - public virtual async Task Login([FromBody]LoginViewModel loginModel) + public virtual async Task Login([FromBody] LoginViewModel loginModel) { loginModel.ReturnUrl = NormalizeReturnUrl(loginModel.ReturnUrl); if (!string.IsNullOrWhiteSpace(loginModel.ReturnUrlHash)) @@ -159,24 +154,6 @@ namespace PearAdmin.AbpTemplate.Admin.Controllers } } - #endregion - - #region Register - - public ActionResult Register() - { - return RegisterView(new RegisterViewModel()); - } - - private ActionResult RegisterView(RegisterViewModel model) - { - ViewBag.IsMultiTenancyEnabled = _multiTenancyConfig.IsEnabled; - - ViewBag.TencentId = AbpTemplateApplicationConsts.DefaultTenantId; - - return View("Register", model); - } - private bool IsSelfRegistrationEnabled() { if (!AbpSession.TenantId.HasValue) @@ -186,210 +163,84 @@ namespace PearAdmin.AbpTemplate.Admin.Controllers return true; } + #endregion + + #region External Login [HttpPost] [UnitOfWork] - public async Task Register(RegisterViewModel model) + public async Task ExternalLogin([FromBody] ExternalAuthenticateModel model) { - try + var externalUser = await GetExternalUserInfo(model); + var loginResult = await _logInManager.LoginAsync(new UserLoginInfo(model.AuthProvider, externalUser.ProviderKey, model.AuthProvider), GetTenancyNameOrNull()); + switch (loginResult.Result) { - ExternalLoginInfo externalLoginInfo = null; - if (model.IsExternalLogin) - { - externalLoginInfo = await _signInManager.GetExternalLoginInfoAsync(); - if (externalLoginInfo == null) + case AbpLoginResultType.Success: { - throw new Exception("Can not external login!"); + await _signInManager.SignInAsync(loginResult.Identity, true); + await UnitOfWorkManager.Current.SaveChangesAsync(); + return Json(new AjaxResponse { TargetUrl = model.ReturnUrl }); } - - model.UserName = model.EmailAddress; - model.Password = Authorization.Users.User.CreateRandomPassword(); - } - else - { - if (model.UserName.IsNullOrEmpty() || model.Password.IsNullOrEmpty()) + case AbpLoginResultType.UnknownExternalLogin: { - throw new UserFriendlyException(L("FormIsNotValidMessage")); - } - } - - var user = await _userRegistrationManager.RegisterAsync( - model.Name, - model.Surname, - model.EmailAddress, - model.UserName, - model.Password, - true // Assumed email address is always confirmed. Change this if you want to implement email confirmation. - ); - - // Getting tenant-specific settings - var isEmailConfirmationRequiredForLogin = await SettingManager.GetSettingValueAsync(AbpZeroSettingNames.UserManagement.IsEmailConfirmationRequiredForLogin); + var user = await _userRegistrationManager.RegisterAsync( + externalUser.Name, + externalUser.Surname, + externalUser.EmailAddress, + externalUser.EmailAddress.ToMd5(), + Authorization.Users.User.CreateRandomPassword(), + true + ); + + user.Logins = new List + { + new UserLogin + { + LoginProvider = externalUser.Provider, + ProviderKey = externalUser.ProviderKey, + TenantId = user.TenantId + } + }; - if (model.IsExternalLogin) - { - Debug.Assert(externalLoginInfo != null); + await CurrentUnitOfWork.SaveChangesAsync(); - if (string.Equals(externalLoginInfo.Principal.FindFirstValue(ClaimTypes.Email), model.EmailAddress, StringComparison.OrdinalIgnoreCase)) - { - user.IsEmailConfirmed = true; - } + // 为新用户执行登录 + var tryLoginResult = await _logInManager.LoginAsync(new UserLoginInfo(model.AuthProvider, model.ProviderKey, model.AuthProvider), GetTenancyNameOrNull()); - user.Logins = new List - { - new UserLogin + if (tryLoginResult.Result == AbpLoginResultType.Success) { - LoginProvider = externalLoginInfo.LoginProvider, - ProviderKey = externalLoginInfo.ProviderKey, - TenantId = user.TenantId - } - }; - } - - await _unitOfWorkManager.Current.SaveChangesAsync(); + await _signInManager.SignInAsync(loginResult.Identity, false); - Debug.Assert(user.TenantId != null); - - var tenant = await _tenantManager.GetByIdAsync(user.TenantId.Value); + return Json(new AjaxResponse { TargetUrl = model.ReturnUrl }); + } - // Directly login if possible - if (user.IsActive && (user.IsEmailConfirmed || !isEmailConfirmationRequiredForLogin)) - { - AbpLoginResult loginResult; - if (externalLoginInfo != null) - { - loginResult = await _logInManager.LoginAsync(externalLoginInfo, tenant.TenancyName); + return Json(new AjaxResponse { TargetUrl = model.ReturnUrl }); } - else - { - loginResult = await GetLoginResultAsync(user.UserName, model.Password, tenant.TenancyName); - } - - if (loginResult.Result == AbpLoginResultType.Success) + default: { - await _signInManager.SignInAsync(loginResult.Identity, false); - return Redirect(GetAppHomeUrl()); + throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt( + loginResult.Result, + model.ProviderKey, + GetTenancyNameOrNull() + ); } - - Logger.Warn("New registered user could not be login. This should not be normally. login result: " + loginResult.Result); - } - - return View("RegisterResult", new RegisterResultViewModel - { - TenancyName = tenant.TenancyName, - NameAndSurname = user.Name + " " + user.Surname, - UserName = user.UserName, - EmailAddress = user.EmailAddress, - IsEmailConfirmed = user.IsEmailConfirmed, - IsActive = user.IsActive, - IsEmailConfirmationRequiredForLogin = isEmailConfirmationRequiredForLogin - }); - } - catch (UserFriendlyException ex) - { - ViewBag.ErrorMessage = ex.Message; - - return View("Register", model); - } - } - - #endregion - - #region External Login - - [HttpPost] - [ValidateAntiForgeryToken] - public ActionResult ExternalLogin(string provider, string returnUrl) - { - var redirectUrl = Url.Action( - "ExternalLoginCallback", - "Account", - new - { - ReturnUrl = returnUrl - }); - - return Challenge( - // TODO: ...? - // new Microsoft.AspNetCore.Http.Authentication.AuthenticationProperties - // { - // Items = { { "LoginProvider", provider } }, - // RedirectUri = redirectUrl - // }, - provider - ); - } - - [UnitOfWork] - public virtual async Task ExternalLoginCallback(string returnUrl, string remoteError = null) - { - returnUrl = NormalizeReturnUrl(returnUrl); - - if (remoteError != null) - { - Logger.Error("Remote Error in ExternalLoginCallback: " + remoteError); - throw new UserFriendlyException(L("CouldNotCompleteLoginOperation")); - } - - var externalLoginInfo = await _signInManager.GetExternalLoginInfoAsync(); - if (externalLoginInfo == null) - { - Logger.Warn("Could not get information from external login."); - return RedirectToAction(nameof(Login)); - } - - await _signInManager.SignOutAsync(); - - var tenancyName = GetTenancyNameOrNull(); - - var loginResult = await _logInManager.LoginAsync(externalLoginInfo, tenancyName); - - switch (loginResult.Result) - { - case AbpLoginResultType.Success: - await _signInManager.SignInAsync(loginResult.Identity, false); - return Redirect(returnUrl); - default: - throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt( - loginResult.Result, - externalLoginInfo.Principal.FindFirstValue(ClaimTypes.Email) ?? externalLoginInfo.ProviderKey, - tenancyName - ); } } - [UnitOfWork] - protected virtual async Task> FindPossibleTenantsOfUserAsync(UserLoginInfo login) + private async Task GetExternalUserInfo(ExternalAuthenticateModel model) { - List allUsers; - using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant)) - { - allUsers = await _userManager.FindAllAsync(login); - } - - return allUsers - .Where(u => u.TenantId != null) - .Select(u => AsyncHelper.RunSync(() => _tenantManager.FindByIdAsync(u.TenantId.Value))) - .ToList(); + var userInfo = await _externalAuthManager.GetUserInfo(model.AuthProvider, model.ProviderAccessCode); + return userInfo; } - #endregion - #region Helpers - - public ActionResult RedirectToAppHome() - { - return RedirectToAction("Index", "Home"); - } + #region Common public string GetAppHomeUrl() { return Url.Action("Index", "Home"); } - #endregion - - #region Common - private string GetTenancyNameOrNull() { if (!AbpSession.TenantId.HasValue) @@ -421,36 +272,5 @@ namespace PearAdmin.AbpTemplate.Admin.Controllers } #endregion - - #region Etc - - /// - /// This is a demo code to demonstrate sending notification to default tenant admin and host admin uers. - /// Don't use this code in production !!! - /// - /// - /// - [AbpMvcAuthorize] - public async Task TestNotification(string message = "") - { - if (message.IsNullOrEmpty()) - { - message = "This is a test notification, created at " + Clock.Now; - } - - var defaultTenantAdmin = new UserIdentifier(1, 2); - var hostAdmin = new UserIdentifier(null, 1); - - await _notificationPublisher.PublishAsync( - "App.SimpleMessage", - new MessageNotificationData(message), - severity: NotificationSeverity.Info, - userIds: new[] { defaultTenantAdmin, hostAdmin } - ); - - return Content("Sent notification: " + message); - } - - #endregion } } diff --git a/src/PearAdmin.AbpTemplate.Admin/Models/Account/ExternalAuthenticateModel.cs b/src/PearAdmin.AbpTemplate.Admin/Models/Account/ExternalAuthenticateModel.cs new file mode 100644 index 0000000..e4baca4 --- /dev/null +++ b/src/PearAdmin.AbpTemplate.Admin/Models/Account/ExternalAuthenticateModel.cs @@ -0,0 +1,11 @@ +namespace PearAdmin.AbpTemplate.Admin.Models.Account +{ + public class ExternalAuthenticateModel + { + public string AuthProvider { get; set; } + public string ProviderKey { get; set; } + public string ProviderAccessCode { get; set; } + public string ReturnUrl { get; set; } + public bool SingleSignIn { get; set; } + } +} diff --git a/src/PearAdmin.AbpTemplate.Admin/Models/Account/RegisterResultViewModel.cs b/src/PearAdmin.AbpTemplate.Admin/Models/Account/RegisterResultViewModel.cs deleted file mode 100644 index 6f25ece..0000000 --- a/src/PearAdmin.AbpTemplate.Admin/Models/Account/RegisterResultViewModel.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace PearAdmin.AbpTemplate.Admin.Models.Account -{ - public class RegisterResultViewModel - { - public string TenancyName { get; set; } - - public string UserName { get; set; } - - public string EmailAddress { get; set; } - - public string NameAndSurname { get; set; } - - public bool IsActive { get; set; } - - public bool IsEmailConfirmationRequiredForLogin { get; set; } - - public bool IsEmailConfirmed { get; set; } - } -} diff --git a/src/PearAdmin.AbpTemplate.Admin/PearAdmin.AbpTemplate.Admin.csproj b/src/PearAdmin.AbpTemplate.Admin/PearAdmin.AbpTemplate.Admin.csproj index fca73ba..3f3ae0a 100644 --- a/src/PearAdmin.AbpTemplate.Admin/PearAdmin.AbpTemplate.Admin.csproj +++ b/src/PearAdmin.AbpTemplate.Admin/PearAdmin.AbpTemplate.Admin.csproj @@ -15,6 +15,7 @@ true + diff --git a/src/PearAdmin.AbpTemplate.Admin/Properties/launchSettings.json b/src/PearAdmin.AbpTemplate.Admin/Properties/launchSettings.json index 6ce592e..d4bd709 100644 --- a/src/PearAdmin.AbpTemplate.Admin/Properties/launchSettings.json +++ b/src/PearAdmin.AbpTemplate.Admin/Properties/launchSettings.json @@ -1,4 +1,4 @@ -{ +{ "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, @@ -17,6 +17,7 @@ }, "PearAdmin.AbpTemplate.Admin": { "commandName": "Project", + "commandLineArgs": "--urls http://192.168.1.8:5000", "launchBrowser": true, "launchUrl": "http://localhost:5000", "environmentVariables": { diff --git a/src/PearAdmin.AbpTemplate.Admin/Startup.cs b/src/PearAdmin.AbpTemplate.Admin/Startup.cs index 3aad1c4..f1c584d 100644 --- a/src/PearAdmin.AbpTemplate.Admin/Startup.cs +++ b/src/PearAdmin.AbpTemplate.Admin/Startup.cs @@ -8,7 +8,6 @@ using Abp.Json; using Hangfire; using Hangfire.MemoryStorage; using LogDashboard; -using LogDashboard.Authorization.Filters; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Identity; @@ -16,7 +15,6 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; using Newtonsoft.Json.Serialization; using PearAdmin.AbpTemplate.Admin.Configuration; using PearAdmin.AbpTemplate.Admin.Extensions; diff --git a/src/PearAdmin.AbpTemplate.Admin/appsettings.json b/src/PearAdmin.AbpTemplate.Admin/appsettings.json index e38770b..5c4a85f 100644 --- a/src/PearAdmin.AbpTemplate.Admin/appsettings.json +++ b/src/PearAdmin.AbpTemplate.Admin/appsettings.json @@ -62,5 +62,12 @@ "final": true } ] + }, + "Authentication": { + "WeChatMiniProgram": { + "IsEnabled": "false", + "AppId": "", + "AppSecret": "" + } } } -- Gitee From e37e18462c687cd54620b1f90714bf3946945c95 Mon Sep 17 00:00:00 2001 From: sassassin <530521314@qq.com> Date: Fri, 17 Sep 2021 08:21:49 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=9B=AA=E8=8A=B1Id?= =?UTF-8?q?=E5=BA=93=EF=BC=8C=E7=94=A8=E6=9D=A5=E5=88=86=E9=85=8D=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=9F=BA=E7=A1=80=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MiniProgramAuthProviderApi.cs | 50 ++++------- .../PearAdmin.AbpTemplate.MiniProgram.csproj | 1 + .../Controllers/AccountController.cs | 88 +++++++++++-------- 3 files changed, 66 insertions(+), 73 deletions(-) diff --git a/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramAuthProviderApi.cs b/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramAuthProviderApi.cs index 484afe9..a3a5425 100644 --- a/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramAuthProviderApi.cs +++ b/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramAuthProviderApi.cs @@ -1,11 +1,11 @@ -using System; -using System.Threading.Tasks; +using System.Threading.Tasks; using Abp.Runtime.Caching; using Castle.Core.Logging; using PearAdmin.AbpTemplate.ExternalAuth; using PearAdmin.AbpTemplate.MiniProgram.Enums; using SKIT.FlurlHttpClient.Wechat.Api; using SKIT.FlurlHttpClient.Wechat.Api.Models; +using Snowflake.Core; namespace PearAdmin.AbpTemplate.MiniProgram { @@ -14,7 +14,7 @@ namespace PearAdmin.AbpTemplate.MiniProgram public const string ProviderName = "WeChatMiniProgram"; private WechatApiClient _weChatApiClient; private readonly ILogger _logger; - private readonly ICacheManager _cacheManager; + private readonly ICacheManager _cacheManager; public MiniProgramAuthProviderApi(ILogger logger, ICacheManager cacheManager) @@ -36,19 +36,26 @@ namespace PearAdmin.AbpTemplate.MiniProgram public async override Task GetUserInfo(string accessCode) { var miniProgramSessionKey = await GetWeChatUserOpenId(accessCode); - var miniProgramUserInfo = await GetWeChatUserInfo(miniProgramSessionKey); + var randomId = GenerateRandomId(); var externalAuthUserInfo = new ExternalAuthUserInfo { - EmailAddress = miniProgramUserInfo.OpenId + $"@{ProviderName}.com",//邮箱唯一性 - Surname = miniProgramUserInfo.Nickname, - Name = miniProgramUserInfo.Nickname, - ProviderKey = miniProgramUserInfo.OpenId, + EmailAddress = randomId + $"@{ProviderName}.com",//邮箱唯一性 + Surname = randomId.ToString(), + Name = randomId.ToString(), + ProviderKey = miniProgramSessionKey.OpenId, Provider = ProviderName, }; return externalAuthUserInfo; } + private long GenerateRandomId() + { + var idWorker = new IdWorker(1, 1); + var id = idWorker.NextId(); + return id; + } + private async Task GetWeChatUserOpenId(string code) { var response = await _weChatApiClient.ExecuteSnsJsCode2SessionAsync(new SnsJsCode2SessionRequest() @@ -68,32 +75,5 @@ namespace PearAdmin.AbpTemplate.MiniProgram return null; } - - private async Task GetWeChatUserInfo(MiniProgramSessionKey miniProgramSessionKey) - { - //var cgibinTokenResponse = await _weChatApiClient.ExecuteCgibinTokenAsync(new CgibinTokenRequest()); - - var cgibinUserInfoResponse = await _weChatApiClient.ExecuteCgibinUserInfoAsync(new CgibinUserInfoRequest() - { - AccessToken = "49_lEGICP1a2U7giCcBjf5X6Wmkr-zyrN9NKtV7ca6VSn8z7jXf5GEc2T4J0wOGRadVGbeZYsDIHM7Wjo1rubJs6DQ9IczjLYXKefT3DEXEA2UUTrRfy_jLNX1FjbwttfaG5LBubDncG-TwvSXqBYTdAAAURM",//cgibinTokenResponse.AccessToken, - OpenId = miniProgramSessionKey.OpenId - }); - if (!cgibinUserInfoResponse.IsSuccessful()) - { - throw new Exception($"ErrorCode:{cgibinUserInfoResponse.ErrorCode}.Message:{cgibinUserInfoResponse.ErrorMessage}"); - } - - return new MiniProgramUserInfo() - { - Nickname = cgibinUserInfoResponse.Nickname, - OpenId = cgibinUserInfoResponse.OpenId, - Sex = cgibinUserInfoResponse.Sex, - HeadImageUrl = cgibinUserInfoResponse.HeadImageUrl, - Country = cgibinUserInfoResponse.Country, - Province = cgibinUserInfoResponse.Province, - City = cgibinUserInfoResponse.City, - UnionId = cgibinUserInfoResponse.UnionId - }; - } } } diff --git a/module/PearAdmin.AbpTemplate.MiniProgram/PearAdmin.AbpTemplate.MiniProgram.csproj b/module/PearAdmin.AbpTemplate.MiniProgram/PearAdmin.AbpTemplate.MiniProgram.csproj index 02dac15..d9dbcad 100644 --- a/module/PearAdmin.AbpTemplate.MiniProgram/PearAdmin.AbpTemplate.MiniProgram.csproj +++ b/module/PearAdmin.AbpTemplate.MiniProgram/PearAdmin.AbpTemplate.MiniProgram.csproj @@ -9,6 +9,7 @@ + diff --git a/src/PearAdmin.AbpTemplate.Admin/Controllers/AccountController.cs b/src/PearAdmin.AbpTemplate.Admin/Controllers/AccountController.cs index 51bf02e..79c51d2 100644 --- a/src/PearAdmin.AbpTemplate.Admin/Controllers/AccountController.cs +++ b/src/PearAdmin.AbpTemplate.Admin/Controllers/AccountController.cs @@ -171,28 +171,39 @@ namespace PearAdmin.AbpTemplate.Admin.Controllers [UnitOfWork] public async Task ExternalLogin([FromBody] ExternalAuthenticateModel model) { - var externalUser = await GetExternalUserInfo(model); - var loginResult = await _logInManager.LoginAsync(new UserLoginInfo(model.AuthProvider, externalUser.ProviderKey, model.AuthProvider), GetTenancyNameOrNull()); - switch (loginResult.Result) + using (AbpSession.Use(AbpTemplateApplicationConsts.DefaultTenantId, null)) { - case AbpLoginResultType.Success: - { - await _signInManager.SignInAsync(loginResult.Identity, true); - await UnitOfWorkManager.Current.SaveChangesAsync(); - return Json(new AjaxResponse { TargetUrl = model.ReturnUrl }); - } - case AbpLoginResultType.UnknownExternalLogin: - { - var user = await _userRegistrationManager.RegisterAsync( - externalUser.Name, - externalUser.Surname, - externalUser.EmailAddress, - externalUser.EmailAddress.ToMd5(), - Authorization.Users.User.CreateRandomPassword(), - true - ); - - user.Logins = new List + var externalUser = await GetExternalUserInfo(model); + var loginResult = await _logInManager.LoginAsync(new UserLoginInfo(model.AuthProvider, externalUser.ProviderKey, model.AuthProvider), GetTenancyNameOrNull()); + switch (loginResult.Result) + { + case AbpLoginResultType.Success: + { + await _signInManager.SignInAsync(loginResult.Identity, true); + await UnitOfWorkManager.Current.SaveChangesAsync(); + return Json(new AjaxResponse { TargetUrl = model.ReturnUrl }); + } + case AbpLoginResultType.UnknownExternalLogin: + { + User user = null; + try + { + + user = await _userRegistrationManager.RegisterAsync( + externalUser.Name, + externalUser.Surname, + externalUser.EmailAddress, + externalUser.EmailAddress.ToMd5(), + Authorization.Users.User.CreateRandomPassword(), + true + ); + } + catch (Exception ex) + { + throw; + } + + user.Logins = new List { new UserLogin { @@ -202,28 +213,29 @@ namespace PearAdmin.AbpTemplate.Admin.Controllers } }; - await CurrentUnitOfWork.SaveChangesAsync(); + await CurrentUnitOfWork.SaveChangesAsync(); - // 为新用户执行登录 - var tryLoginResult = await _logInManager.LoginAsync(new UserLoginInfo(model.AuthProvider, model.ProviderKey, model.AuthProvider), GetTenancyNameOrNull()); + // 为新用户执行登录 + var tryLoginResult = await _logInManager.LoginAsync(new UserLoginInfo(model.AuthProvider, model.ProviderKey, model.AuthProvider), GetTenancyNameOrNull()); - if (tryLoginResult.Result == AbpLoginResultType.Success) - { - await _signInManager.SignInAsync(loginResult.Identity, false); + if (tryLoginResult.Result == AbpLoginResultType.Success) + { + await _signInManager.SignInAsync(loginResult.Identity, false); + + return Json(new AjaxResponse { TargetUrl = model.ReturnUrl }); + } return Json(new AjaxResponse { TargetUrl = model.ReturnUrl }); } - - return Json(new AjaxResponse { TargetUrl = model.ReturnUrl }); - } - default: - { - throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt( - loginResult.Result, - model.ProviderKey, - GetTenancyNameOrNull() - ); - } + default: + { + throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt( + loginResult.Result, + model.ProviderKey, + GetTenancyNameOrNull() + ); + } + } } } -- Gitee From 08c3a9928b74f9316271d8c16d05b7347bf36492 Mon Sep 17 00:00:00 2001 From: sassassin <530521314@qq.com> Date: Sat, 25 Sep 2021 17:03:25 +0800 Subject: [PATCH 3/4] Clean code --- .../MiniProgramUserInfo.cs | 14 -------------- .../Properties/launchSettings.json | 1 - 2 files changed, 15 deletions(-) delete mode 100644 module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramUserInfo.cs diff --git a/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramUserInfo.cs b/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramUserInfo.cs deleted file mode 100644 index a22d1f8..0000000 --- a/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramUserInfo.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace PearAdmin.AbpTemplate.MiniProgram -{ - public class MiniProgramUserInfo - { - public string HeadImageUrl { get; set; } - public string Country { get; set; } - public string Province { get; set; } - public string City { get; set; } - public int Sex { get; set; } - public string Nickname { get; set; } - public string? UnionId { get; set; } - public string OpenId { get; set; } - } -} diff --git a/src/PearAdmin.AbpTemplate.Admin/Properties/launchSettings.json b/src/PearAdmin.AbpTemplate.Admin/Properties/launchSettings.json index d4bd709..e0fcdf7 100644 --- a/src/PearAdmin.AbpTemplate.Admin/Properties/launchSettings.json +++ b/src/PearAdmin.AbpTemplate.Admin/Properties/launchSettings.json @@ -17,7 +17,6 @@ }, "PearAdmin.AbpTemplate.Admin": { "commandName": "Project", - "commandLineArgs": "--urls http://192.168.1.8:5000", "launchBrowser": true, "launchUrl": "http://localhost:5000", "environmentVariables": { -- Gitee From db702284267d0178d62aa4c399fbbe87dc46f715 Mon Sep 17 00:00:00 2001 From: sassassin <530521314@qq.com> Date: Sat, 25 Sep 2021 17:11:35 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MiniProgramAuthProviderApi.cs | 12 ++++- .../Controllers/AccountController.cs | 44 +++++++------------ .../Account/ExternalAuthenticateModel.cs | 1 - 3 files changed, 26 insertions(+), 31 deletions(-) diff --git a/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramAuthProviderApi.cs b/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramAuthProviderApi.cs index a3a5425..0199295 100644 --- a/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramAuthProviderApi.cs +++ b/module/PearAdmin.AbpTemplate.MiniProgram/MiniProgramAuthProviderApi.cs @@ -1,5 +1,6 @@ using System.Threading.Tasks; using Abp.Runtime.Caching; +using Abp.UI; using Castle.Core.Logging; using PearAdmin.AbpTemplate.ExternalAuth; using PearAdmin.AbpTemplate.MiniProgram.Enums; @@ -72,8 +73,17 @@ namespace PearAdmin.AbpTemplate.MiniProgram UnionId = response.UnionId }; } + if (response.ErrorCode == (int)RequestErrorCodeEnum.CodeError) + { + throw new UserFriendlyException("There was an error calling the mini program api code"); + } + + if (response.ErrorCode == (int)RequestErrorCodeEnum.Busy) + { + throw new UserFriendlyException("The wechat mini program api is busy"); + } - return null; + throw new UserFriendlyException("The request for authentication failed"); } } } diff --git a/src/PearAdmin.AbpTemplate.Admin/Controllers/AccountController.cs b/src/PearAdmin.AbpTemplate.Admin/Controllers/AccountController.cs index 79c51d2..55c2483 100644 --- a/src/PearAdmin.AbpTemplate.Admin/Controllers/AccountController.cs +++ b/src/PearAdmin.AbpTemplate.Admin/Controllers/AccountController.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Threading.Tasks; using Abp.Authorization; using Abp.Authorization.Users; @@ -185,43 +184,30 @@ namespace PearAdmin.AbpTemplate.Admin.Controllers } case AbpLoginResultType.UnknownExternalLogin: { - User user = null; - try - { - - user = await _userRegistrationManager.RegisterAsync( - externalUser.Name, - externalUser.Surname, - externalUser.EmailAddress, - externalUser.EmailAddress.ToMd5(), - Authorization.Users.User.CreateRandomPassword(), - true - ); - } - catch (Exception ex) - { - throw; - } - + var user = await _userRegistrationManager.RegisterAsync( + externalUser.Name, + externalUser.Surname, + externalUser.EmailAddress, + externalUser.EmailAddress.ToMd5(), + Authorization.Users.User.CreateRandomPassword(), + true + ); user.Logins = new List - { - new UserLogin { - LoginProvider = externalUser.Provider, - ProviderKey = externalUser.ProviderKey, - TenantId = user.TenantId - } - }; - + new UserLogin + { + LoginProvider = externalUser.Provider, + ProviderKey = externalUser.ProviderKey, + TenantId = user.TenantId + } + }; await CurrentUnitOfWork.SaveChangesAsync(); - // 为新用户执行登录 var tryLoginResult = await _logInManager.LoginAsync(new UserLoginInfo(model.AuthProvider, model.ProviderKey, model.AuthProvider), GetTenancyNameOrNull()); if (tryLoginResult.Result == AbpLoginResultType.Success) { await _signInManager.SignInAsync(loginResult.Identity, false); - return Json(new AjaxResponse { TargetUrl = model.ReturnUrl }); } diff --git a/src/PearAdmin.AbpTemplate.Admin/Models/Account/ExternalAuthenticateModel.cs b/src/PearAdmin.AbpTemplate.Admin/Models/Account/ExternalAuthenticateModel.cs index e4baca4..b8d284f 100644 --- a/src/PearAdmin.AbpTemplate.Admin/Models/Account/ExternalAuthenticateModel.cs +++ b/src/PearAdmin.AbpTemplate.Admin/Models/Account/ExternalAuthenticateModel.cs @@ -6,6 +6,5 @@ public string ProviderKey { get; set; } public string ProviderAccessCode { get; set; } public string ReturnUrl { get; set; } - public bool SingleSignIn { get; set; } } } -- Gitee