如何为ABP应用程序自定义登录管理器


在使用应用程序启动模板创建新应用程序之后,您可能需要扩展或更改SignIn Manager的默认行为,以满足身份验证和注册流程的需要。ABP帐户模块登录管理使用身份管理模块,而身份管理模块使用默认的Microsoft身份登录管理器请参阅此处)。

要编写您的自定义登录管理器,您需要扩展Microsoft身份登录管理器类并将其注册到DI容器。

本文档说明了如何针对您自己的应用程序自定义SignIn Manager。

创建一个CustomSignInManager

创建一个继承Microsoft Identity包SignInMager新类

public class CustomSignInManager : Microsoft.AspNetCore.Identity.SignInManager<Volo.Abp.Identity.IdentityUser> {         public CustomSignInManager(             Microsoft.AspNetCore.Identity.UserManager<Volo.Abp.Identity.IdentityUser> userManager,             Microsoft.AspNetCore.Http.IHttpContextAccessor contextAccessor,             Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<Volo.Abp.Identity.IdentityUser> claimsFactory,             Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions> optionsAccessor,             Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.SignInManager<Volo.Abp.Identity.IdentityUser>> logger,             Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider schemes,             Microsoft.AspNetCore.Identity.IUserConfirmation<Volo.Abp.Identity.IdentityUser> confirmation)             : base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemes, confirmation)         {         } }
C#

使用Volo.Abp.Identity.IdentityUser类型使SignInManager继承,而不是继承应用程序的AppUser,这一点很重要

之后,您可以覆盖所需的任何SignIn Manager方法,并添加身份验证或注册流程所需的新方法和属性。

重写GetExternalLoginInfoAsync方法

在这种情况下,我们将覆盖GetExternalLoginInfoAsync实现第三方身份验证时调用方法。

重写方法的一个好方法是复制其源代码在这种情况下,我们将使用源代码的较小修改版本,该版本显式显示了方法和属性的名称空间,以帮助更好地理解该概念。

public async override Task<Microsoft.AspNetCore.Identity.ExternalLoginInfo> GetExternalLoginInfoAsync(string expectedXsrf = null) {     var auth = await Context.AuthenticateAsync(Microsoft.AspNetCore.Identity.IdentityConstants.ExternalScheme);     var items = auth?.Properties?.Items;     if (auth?.Principal == null || items == null || !items.ContainsKey(LoginProviderKey))     {         return null;     }      if (expectedXsrf != null)     {         if (!items.ContainsKey(XsrfKey))         {             return null;         }         var userId = items[XsrfKey] as string;         if (userId != expectedXsrf)         {             return null;         }     }      var providerKey = auth.Principal.FindFirstValue(ClaimTypes.NameIdentifier);     var provider = items[LoginProviderKey] as string;     if (providerKey == null || provider == null)     {         return null;     }      var providerDisplayName = (await GetExternalAuthenticationSchemesAsync()).FirstOrDefault(p => p.Name == provider)?.DisplayName         ?? provider;     return new Microsoft.AspNetCore.Identity.ExternalLoginInfo(auth.Principal, provider, providerKey, providerDisplayName)     {         AuthenticationTokens = auth.Properties.GetTokens(),         AuthenticationProperties = auth.Properties     }; }
C#

要调用您的重写方法并使自定义的SignIn Manager类起作用,您需要将您的类注册到Dependency Injection System

注册到依赖注入

CustomSignInManager应通过添加IdentityBuilderIdentityBuilderExtensions的AddSignInManager扩展方法来完成注册

在您的.Web项目中,找到,YourProjectNameWebModule然后在PreConfigureServices方法下添加以下代码,以将旧代码替换为SignInManager自定义代码:

PreConfigure<IdentityBuilder>(identityBuilder => {     identityBuilder.AddSignInManager<CustomSignInManager>(); });
C#

源代码

您可以在此处找到完整示例的源代码

https://community.abp.io/articles/how-to-customize-the-signin-manager-3e858753


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM