我试图阻止用户使用他们最近的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);
}
答案 0 :(得分:1)
好的,我会把我的评论转化为某种答案。因此,如上所述,密码存储在表Hashed中未加密。因此,根据定义,它们无法重新获得(easily)。
除了保留以前密码的记录之外,没有什么可以阻止你将散列密码放入表中。然后,当用户输入密码时,您将其哈希并检查它是否已被使用,就像它没有进行哈希处理一样,但是使用哈希而不是原始密码(这样可以保证一切都很好和安全)。
我想知道我是否可以调用一个函数或者是否必须实现 实际的哈希算法使用相同的盐而不是什么?
UserManager
implements a PasswordHasher
。因此,以与默认哈希相同的方式获取密码哈希应该如下所示:
PasswordVerificationResult passwordMatch = UserManager.PasswordHasher.VerifyHashedPassword(previousPassword1, rawPassword);
我不使用此身份验证方法,因此以上内容未经测试且仅基于MSDN文档。应该没问题,但如果它不起作用,请告诉我。
如果密码匹配则passwordMatch == PasswordVerificationResult.Success
。您可能还需要允许PasswordVerificationResult.SuccessRehashNeeded