试图阻止用户使用旧密码进行新密码

时间:2016-10-24 12:33:53

标签: asp.net asp.net-mvc

我试图阻止用户使用他们最近的5个密码。我正在使用Visual Studio 2015中的确切模板,它为您提供了一个基本的Identity用户系统。

我已经将以下列分别添加到我的用户数据库,passwordLastChanged(Date)和5列名为previousPassword1(到5)的列中。

我需要使用类似User.Identity.GetUserPassword的内容从数据库中检索当前用户密码,我还需要model.NewPassword.Encrypt(那些不存在!)的内容。是否有方法可以执行这些我在api中看不到的操作?

我还必须加密我的新数据以查看它是否匹配,如何加密字符串的方式与我的用户密码加密相同?

//
// POST: /Manage/ChangePassword
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ChangePassword(ChangePasswordViewModel model)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }
    var result = await UserManager.ChangePasswordAsync(User.Identity.GetUserId(), model.OldPassword, model.NewPassword);
    if (result.Succeeded)
    {
        var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
        if (user != null)
        {
            await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
        }
        return RedirectToAction("Index", new { Message = ManageMessageId.ChangePasswordSuccess });
    }
    AddErrors(result);
    return View(model);
}

1 个答案:

答案 0 :(得分:1)

好的,我会把我的评论转化为某种答案。因此,如上所述,密码存储在表Hashed中未加密。因此,根据定义,它们无法重新获得(easily)。

除了保留以前密码的记录之外,没有什么可以阻止你将散列密码放入表中。然后,当用户输入密码时,您将其哈希并检查它是否已被使用,就像它没有进行哈希处理一样,但是使用哈希而不是原始密码(这样可以保证一切都很好和安全)。

  

我想知道我是否可以调用一个函数或者是否必须实现   实际的哈希算法使用相同的盐而不是什么?

UserManager implements a PasswordHasher。因此,以与默认哈希相同的方式获取密码哈希应该如下所示:

PasswordVerificationResult passwordMatch = UserManager.PasswordHasher.VerifyHashedPassword(previousPassword1, rawPassword);

我不使用此身份验证方法,因此以上内容未经测试且仅基于MSDN文档。应该没问题,但如果它不起作用,请告诉我。

如果密码匹配则passwordMatch == PasswordVerificationResult.Success。您可能还需要允许PasswordVerificationResult.SuccessRehashNeeded