我在现有应用程序中使用 ASP.NET Core Identity 2.0 实现了身份验证。由于我使用自己的数据库架构和类,因此我使用自己的User类,并且必须创建自定义UserStore。 问题是当我创建用户时,我没有使用与 Identity 中使用的相同方法散列他们的密码,并且在调用此函数时登录失败:
var result = await _signInManager.PasswordSignInAsync(model.Login, model.Password, model.RememberMe, lockoutOnFailure: false);
我在不同的帖子中看到,您需要覆盖CheckPasswordAsync((函数以添加自己的方法来检查密码是否相似。但是,我试图实现它,但没有成功......
自定义用户管理器:
public class CustomUserManager<TUser> : UserManager<TUser> where TUser : class
{
public CustomUserManager(IUserStore<TUser> store, IOptions<IdentityOptions> optionsAccessor,
IPasswordHasher<TUser> passwordHasher, IEnumerable<IUserValidator<TUser>> userValidators,
IEnumerable<IPasswordValidator<TUser>> passwordValidators, ILookupNormalizer keyNormalizer,
IdentityErrorDescriber errors, IServiceProvider services, ILogger<UserManager<TUser>> logger) : base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger)
{
}
public override Task<bool> CheckPasswordAsync(TUser user, string password)
{
return base.CheckPasswordAsync(user, password);
}
}
帐户控制器构造函数:
public AccountController(
CustomUserManager<User> userManager,
SignInManager<User> signInManager,
ILogger<AccountController> logger)
{
_userManager = userManager;
_signInManager = signInManager;
_logger = logger;
}
我什至尝试在服务配置中添加范围:
services.AddIdentity<User, ProfileUser>().AddDefaultTokenProviders();
services.AddTransient<IUserStore<User>, UserIdentity>();
services.AddTransient<IRoleStore<ProfileUser>, ProfileIdentity>();
services.AddScoped< UserManager<User>, CustomUserManager>();
但它不起作用。当我启动应用程序并尝试访问登录页面时,出现错误:
InvalidOperationException: Unable to resolve service for type 'CustomUserManager`1[Maquetteur.Entities.User]' while attempting to activate 'Maquetteur.Web.AccountController'.
使用默认的用户管理器,我可以访问登录页面,但登录功能失败。使用自定义用户管理器,我无法访问登录页面。
你知道我做错了什么吗?或者也许还有另一种方法可以实现我们自己的方法来检查用户登录时密码是否相似?
当您添加此行时,您正朝着正确的方向前进:
services.AddScoped<UserManager<User>, CustomUserManager>();
这句话基本上是说:如果我要求UserManager<User>
,请给我一个CustomUserManager
。但是,这不是您在这里的意图。相反,你想说:如果我要求CustomUserManager
,请给我一个CustomUserManager
。
它实际上很容易修复 - 您可以在添加身份服务时注册它。 例如:
services
.AddIdentity<User, ProfileUser>()
.AddUserManager<CustomUserManager<User>>()
.AddDefaultTokenProviders();
注意:还有其他扩展用于注册自定义IUserStore
和IRoleStore
实现。