我按如下方式设置身份:
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'.
如何让自定义登录管理器正常工作?
答案 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
的原因是它将取代默认实现,这是大多数人想要的。