比较数据库中的密码以进行密码更新

时间:2018-09-25 14:35:58

标签: c# asp.net-mvc asp.net-identity

这是我创建用户播种数据库的方式

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

我根本无法使哈希匹配。我用来创建用户和哈希密码的方法是相似的。不知道我还能做什么。

1 个答案:

答案 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,它将在使用提供的新密码之前检查密码。