我有一个我在MVC 3中创建的登录表单,其中有一个“更改密码”视图。目前,重用以前的密码没有任何限制。我知道我需要创建一个自定义密码管理器,因为ASP.net没有任何方法可以解决这个问题。我创建了一个'previousPassswords'表。
目前,我的'changePassword'控制器如下所示:
if (ModelState.IsValid)
{
// ChangePassword will throw an exception rather
// than return false in certain failure scenarios.
bool changePasswordSucceeded;
try
{
MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);
changePasswordSucceeded = currentUser.ChangePassword(model.OldPassword, model.NewPassword);
}
catch (Exception)
{
changePasswordSucceeded = false;
}
if (changePasswordSucceeded)
{
return RedirectToAction("ChangePasswordSuccess");
}
else
{
ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
我想比较新密码(最好加密)和previousPasswords表中的最后一个'n'密码。
这是推荐的方法还是有更好的方法?
你不应该检查以前的密码(比较:https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-63b.pdf)。
首先,它增加了用户使用的机会,因此更加不安全密码:'我不能再使用myPassword作为密码了?好吧,然后让它成为密码'。或者更糟:“我不能使用我的个人密码?好吧,我要使用电子邮件密码然后'
其次,如果您的用户数据被盗/被黑,效果会更糟:每个用户不会丢失一个密码而是多个。
对于密码策略,请检查第5.1节