在Asp,Net Core 3 Identity中创建自定义SignInManager

时间:2019-03-18 21:55:30

标签: c# asp.net-core asp.net-identity asp.net-core-3.0

我想为SignInManager创建一个自定义类,因此我创建了一个从SignInManager<>继承的类,如下所示:

public class ApplicationSignInManager : SignInManager<ApplicationUser>
{
    private readonly UserManager<ApplicationUser> _userManager;
    private readonly ApplicationDbContext _dbContext;
    private readonly IHttpContextAccessor _contextAccessor;

    public ApplicationSignInManager(
UserManager<ApplicationUser> userManager,
        IHttpContextAccessor contextAccessor,
        IUserClaimsPrincipalFactory<ApplicationUser> claimsFactory,
        IOptions<IdentityOptions> optionsAccessor,
        ILogger<SignInManager<ApplicationUser>> logger,
        ApplicationDbContext dbContext,
        IAuthenticationSchemeProvider schemeProvider
        )
        : base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemeProvider)
    {
        _userManager = userManager ?? throw new ArgumentNullException(nameof(userManager));
        _contextAccessor = contextAccessor ?? throw new ArgumentNullException(nameof(contextAccessor));
        _dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
    }
}

,然后将其添加到Startup.cs的服务配置中:

services.AddDefaultIdentity<ApplicationUser>(configure =>
{
    configure.User.AllowedUserNameCharacters += " ";
}).AddSignInManager<ApplicationSignInManager>()
  .AddDefaultUI(UIFramework.Bootstrap4)
  .AddEntityFrameworkStores<ApplicationDbContext>();

问题是无法将默认的SignInManager<ApplicationUser>强制转换为ApplicationSignInManager,因此,在访问其管理器已注入的页面时,会出现此错误:

  

InvalidCastException:无法转换类型为'Microsoft.AspNetCore.Identity.SignInManager`1 [Socialize.Data.ApplicationUser]'类型的对象来键入'Socialize .Utilities.Identity.ApplicationSignInManager'

1 个答案:

答案 0 :(得分:1)

您的问题是由您在AddSignInManager<ApplicationSignInManager>()之前注册.AddDefaultUI(UIFramework.Bootstrap4)引起的。

对于AddDefaultUI,它将调用builder.AddSignInManager();,后者将注册typeof(SignInManager<>).MakeGenericType(builder.UserType),并将覆盖您之前的设置。

尝试以下代码:

        services.AddDefaultIdentity<ApplicationUser>()                
            .AddDefaultUI(UIFramework.Bootstrap4)
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddSignInManager<ApplicationSignInManager>();