使用自定义 SignInManager

Using a Custom SignInManager

我设置身份如下:

services.AddIdentity<IdentityUser, IdentityRole>(
    c =>
    {
        c.Password.RequireDigit = false;
        c.Password.RequiredLength = 8;
        c.Password.RequireLowercase = false;
        c.Password.RequireNonLetterOrDigit = false;
        c.Password.RequireUppercase = false;
    })
    .AddUserManager<CustomUserManager>()
    .AddUserValidator<CustomUserValidator>()
    .AddCustomStores<PrimaryContext>()
    .AddDefaultTokenProviders();

我想使用自定义登录管理器,但没有 AddSignInManager 方法。我看到其他人建议我在上面的片段下面添加以下行:

services.AddScoped<SignInManager<IdentityUser>, CustomSignInManager>();

但是,这会导致内部服务器错误:

InvalidOperationException: Unable to resolve service for type 'MyProject.Identity.CustomSignInManager' while attempting to activate 'MyProject.Controllers.AccountController'.

如何让我的自定义登录管理器正常工作?

原来是我的误会。而不是我的控制器中的以下内容:

public AccountController(CustomUserManager userManager,
    CustomSignInManager signInManager)
{
    UserManager = userManager;
    SignInManager = signInManager;
}

这个更冗长的代码块似乎可以与我原来的问题中显示的附加行结合使用:

public AccountController(CustomUserManager userManager,
    SignInManager<IdentityUser> signInManager)
{
    if(!(signInManager is CustomSignInManager))
    {
        throw new ArgumentException(
            "signInManager must be an instance of CustomSignInManager");
    }

    UserManager = userManager;
    SignInManager = signInManager as CustomSignInManager;
}

这不是特别好,但很管用。

如评论中所述,您应该使用 services.AddScoped<SignInManager<IdentityUser>, CustomSignInManager>();

即使可以在控制器中更改 signinmanagers,它也将被视为一种反模式,因为它需要在您将执行登录的每个可能的控制器中实现。

使用AddScoped的原因是它会替换默认实现,这是大多数人想要做的。