asp.net - 试图阻止用户使用旧密码作为新密码

标签 asp.net asp.net-mvc

我试图阻止用户使用他们最后 5 个密码中的任何一个。我使用的是 Visual Studio 2015 中的模板,它为您提供了一个基本的身份用户系统。

我已将以下列分别添加到我的用户数据库 passwordLastChanged(Date) 和名为 previousPassword1(至 5)的 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);
}

最佳答案

好的,我会把我的评论变成某种答案。因此,如前所述,密码存储在表 Hashed 中。未加密。所以根据定义,它们不能被检索 ( easily )。

尽管可以保留以前密码的记录,但没有什么可以阻止您将散列密码放入表中。然后,当用户输入密码时,您对其进行哈希处理并检查它是否已被使用,这与未进行哈希处理完全相同,但使用的是哈希而不是原始密码(这也使一切都很好和安全)。

I wonder If I can just call a function or if I will have to implement the actual hashing algorithm that uses the same salt and what not?

UserManager implements a PasswordHasher .因此,要获得以与默认哈希相同的方式哈希的密码应该很简单:

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

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

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

关于asp.net - 试图阻止用户使用旧密码作为新密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40218577/

相关文章:

asp.net-mvc - 如何测试内容部分是否在 ASP.NET MVC 3 的 RenderSection 中提供

c# - 静态存储库 - 解决方法

asp.net-mvc - 如何更改 EF 生成的类属性的 [DisplayName]?

Javascript 在 asp.net 母版页中没有做任何事情

c# - Web 表单中的 Cookie 最长期限

javascript - Uncaught ReferenceError : ActiveXObject is not defined Error in Chrome

c# - NHibernate、验证逻辑和 AutoDirtyCheck

sql-server - 连接字符串中数据源 =(local) 背后的逻辑

asp.net - 使用 ASP.NET MVC 3 构建的 REST API 的版本控制 - 最佳实践

c# - .NET Core 2.1/Angular - SignalR 只需 2 分钟即可连接到集线器