【问题标题】:Check Password change to ensure that new password doesn't equal last password used检查密码更改以确保新密码不等于上次使用的密码
【发布时间】:2012-10-18 22:20:02
【问题描述】:

我只是想知道如何检查(当用户在密码过期后更改密码时)如何使用(在 WebMatrix 中)if 分支来确保新密码不等于以前的密码。

除了上次使用的密码之外,我认为我不想再检查任何密码历史记录,所以只要我能检查以前的密码,我认为就可以了。

我当然可以查询数据库并检查,但由于密码不是以纯文本形式存储的,我知道这不会起作用,但我也在这里检查了 WebSecurity 方法:

http://msdn.microsoft.com/en-us/library/webmatrix.webdata.websecurity(v=vs.111).aspx

什么也没找到。

完成这项工作的最佳方法是什么?

【问题讨论】:

  • @everyone,我喜欢我总是尝试以“大家好”开始我的帖子,它总是省略“你好”部分(我敢肯定是故意的)所以听起来就像我我用斯大林式的语气向社区发表讲话,哈哈 :)
  • 这很大程度上是由于您可以在meta.stackoverflow.com - Should 'Hi', 'thanks,' taglines, and salutations be removed from posts?上阅读到的几个因素
  • @Erik Philips 哦,没关系,我确信这是有充分理由的,我没有抱怨。我只是觉得这很有趣,并想向阅读此文的任何人解释,我并不想变得粗鲁。 :) 谢谢你的链接!

标签: c# razor webmatrix change-password


【解决方案1】:

由于密码未存储在数据库中,因此您无法执行此操作,除非您在用户首次注册时以及随后更改密码时记下密码。

这里具有讽刺意味的是,通过存储原始密码(即使处于加密状态),实际上会降低应用程序的安全性。

【讨论】:

  • 是的,这就是我所害怕的。考虑到它潜在的未来环境的性质,我真的不想损害这个应用程序的安全性。其他网站如何做到这一点?我的意思是我知道我已经看到一些网站这样做(但可能不是网页)。无论如何,谢谢你的回答,迈克
  • 有没有办法强制 C# 以加密形式检查密码?我的意思是,例如当用户登录时。我知道代码必须以某种方式检查此密码才能对用户进行身份验证。有没有办法强制 C# 以与用户尝试登录时大致相同的方式检查用户密码?
  • 另外,我看到这里列出了“SimpleMembershipProvider.GetPassword”方法:msdn.microsoft.com/en-us/library/… ----- 但是,我无法使用它(老实说,我不认为我了解应该如何、在何处和/或何时使用此方法)。
  • 另外,当您说“由于密码未存储在数据库中”时,我不完全确定您的意思。我的意思是,它以加密形式存储在数据库中。这是您的意思,没有存储(未加密)在数据库中,还是我的问题令人困惑?
  • 密码本身不存储在数据库中。而是将哈希存储在那里。散列的生成方式使得解密几乎不可能。您可以在此处阅读更多详细信息:mikesdotnetting.com/Article/200/…。我不明白您为什么担心人们不会将密码重置为原来的密码。大多数其他网站都允许这样做。在 SimpleMembership Provider 中没有实现 GetPassword 方法。
【解决方案2】:

对于任何感兴趣的人,我确实找到了一个很好的解决这个问题的方法,可以很好地完成工作。

但请记住,这仅适用于检查他们拥有/拥有的最后一个密码。

这是我实现的:

首先,当然,在登录页面中,在其他代码中以及在实际登录后,我有一个明显的(检查他们的密码是否超过 6 个月并需要更改):

if(WebSecurity.GetPasswordChangedDate(username).AddMonths(6) < DateTime.UtcNow)
{
    WebSecurity.Logout();
    Session["gActionMessage"] = "Your password has expired. Please change your password by visiting \"Login\" then \"Change Password\"";
    Session["gActionMessageDisplayed"] = "not";
    Response.Redirect("~/");
}

然后,我在“更改密码”页面上想到了这个(实际上是密码重置令牌的电子邮件验证后的重定向页面,但你明白了):

if(WebSecurity.Login(email, newPassword, false) && WebSecurity.UserExists(email) && WebSecurity.GetPasswordChangedDate(email).AddMonths(6) < DateTime.UtcNow)
{
    WebSecurity.Logout();
    errorMessage = "You cannot repeat your last expired password.";
}

这里的 if 分支做了三项检查:

首先,如果可能,它会根据他们输入的新密码有效地检查并登录他们。

其次,它检查用户是否存在(不确定我是否需要这个,但无论如何)。

最后,检查以确保他们的密码更改日期超过 6 个月(因为同一页面用于“忘记密码”的内容,所以这只是确保在以这种方式出错之前满足正确的情况) .

因此,简而言之,如果他们的新密码仍然足以让他们登录(当然是在它实际更改之前),那么这是重复的,随后将他们注销并向他们抛出错误消息而不是更改密码。如果登录不够,则不能是重复密码,(只要满足其他要求)然后更改密码。

希望这对以后在更改密码时可能需要使用 WebMatrix 的非重复密码的任何人有所帮助!

【讨论】:

    【解决方案3】:

    引用 System.Web.Helpers 程序集,

    创建一个名为“UserPasswordHistory”的自定义表,其中包含存储在“Password”列中的散列密码,并在“PasswordVersion”列中增加版本号,每次注册用户或更新密码时都会插入一行对于给定的用户, 以下代码有效。

    var userProfile = db.UserProfiles.First(x => x.UserId == userId);
                    var passwords = (userProfile.UserPasswordHistory
                                              .OrderByDescending(x => x.PasswordVersion)
                                              .Take(_configuration.PasswordCountBeforeReuseAllowed))
                                              .Select(x => x.Password);
    
    return passwords.Any(previousPassword => Crypto.VerifyHashedPassword(previousPassword, password));
    

    要回答专门提出的问题,_configuration.PasswordCountBeforeReuseAllowed 将设置为 1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      相关资源
      最近更新 更多