Сравните пароль из базы данных для обновления пароля - PullRequest
0 голосов
/ 25 сентября 2018

Вот как я создаю пользователя для заполнения моей базы данных

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 голосов
/ 25 сентября 2018

Если вы посмотрите на исходный код для PasswordHasher.HashPassword , вы увидите следующее:

using (var deriveBytes = new Rfc2898DeriveBytes(password, SaltSize, PBKDF2IterCount))
{
    salt = deriveBytes.Salt;
    subkey = deriveBytes.GetBytes(PBKDF2SubkeyLength);
}

Итак, при вызове генерируется новая соль и подраздел.Вот почему ваша проверка никогда не будет (насколько это доказано) возвращать true.

. Для этой конкретной цели PasswordHasher имеет метод VerifyHashedPassword, который может воссоздать хеш с помощьюсохраненная соль и подраздел - это то, что вызывается при входе в систему с помощью Identity.

Однако обратите внимание, что в вашем методе отсутствует обновление метки безопасности пользователя , которое должно обновляться припароль меняется в целях безопасности.

Кроме того, обратите внимание, что вся эта ручная работа, которую вы выполняете, уже была рассмотрена в основных библиотеках Identity, и все, что вам нужно сделать, это вызвать UserManager.UpdatePasswordAsync, который проверитперед использованием нового пароля.

...