新文章 网摘 文章 随笔 日记

如何为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

posted @ 2021-03-31 16:43  岭南春  阅读(1129)  评论(0)    收藏  举报