使用自定义SignInManager

时间:2016-05-18 23:51:09

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

我按如下方式设置身份:

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'.

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

2 个答案:

答案 0 :(得分:3)

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

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;
}

这不是特别好但是有效。

答案 1 :(得分:0)

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

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

使用AddScoped的原因是它将取代默认实现,这是大多数人想要的。