这是我创建用户播种数据库的方式
if (!context.Users.Any())
{
var userStore = new UserStore<ApplicationUser>(context);
var userManager = new UserManager<ApplicationUser>(userStore);
userManager.Create(user, "P@ssw0rd");
context.AspNetUsersExtendedDetails.AddOrUpdate(userExtended);
context.SaveChanges();
}
当我尝试像这样更新密码时,会发生问题:
var userStore = new UserStore<ApplicationUser>(dbContext);
var userManager = new UserManager<ApplicationUser>(userStore);
var currentPasswordHash = userManager.PasswordHasher.HashPassword(Input.CurrentPassword);
if(user.PasswordHash == currentPasswordHash)
{
var passwordHash = userManager.PasswordHasher.HashPassword(Input.NewPassword);
user.PasswordHash = passwordHash;
dbContext.SaveChanges();
logger.Info(AspNetEventLogs.Update + " Password updated for User: " + user.UserName);
}
else
{
logger.Error(AspNetEventLogs.Error + " Current password incorrect");
}
我根本无法使哈希匹配。我用来创建用户和哈希密码的方法是相似的。不知道我还能做什么。
答案 0 :(得分:1)
如果您查看PasswordHasher.HashPassword的源代码,则会看到以下内容:
using (var deriveBytes = new Rfc2898DeriveBytes(password, SaltSize, PBKDF2IterCount))
{
salt = deriveBytes.Salt;
subkey = deriveBytes.GetBytes(PBKDF2SubkeyLength);
}
因此,当您调用它时会生成一个新的盐和子项。这就是为什么您的支票永远不会(据已证明的那样)返回true
。
为此,PasswordHasher
有一个VerifyHashedPassword
方法,该方法可以使用存储的salt和子项重新创建哈希-当您使用Identity登录时,这就是所谓的方法。
但是,请注意,出于安全目的更改密码时必须更新您的方法lacks the update of the user's SecurityStamp。
此外,请注意,Identity的核心库中已经考虑了您正在执行的所有手动工作,而您要做的只是调用UserManager.UpdatePasswordAsync
,它将在使用提供的新密码之前检查密码。