生成临时URL以重置密码

时间:2009-12-31 15:23:35

标签: url passwords reset

我希望在我的网站上实现忘记密码功能。我喜欢这样的选项,其中包含一段时间后过期的临时一次性使用URL的电子邮件被发送给用户。

我已经查看了以下页面以获得这些想法,但我不知道如何使用ASP.NET和C#实现这一点。正如其中一位用户指出的那样,如果我可以在不将这些信息存储在数据库中的情况下实现这一点,那将是理想的。请指教。

Password reset by emailing temporary passwords

感谢。

9 个答案:

答案 0 :(得分:64)

最简单的方法可能是修改你的用户表以添加2个额外的列,或者如果你不想修改现有的表,你可以添加一个名为“UserPasswordReset”的新依赖表或类似的东西。列是这样的:

PasswordResetToken UNIQUEIDENTIFIER,
PasswordResetExpiration DATETIME

如果您使用其他表路径,您还可以添加UserID列,将其作为主键,并将foriegn键引用返回到users表。还建议使用UNIQUE约束。然后,您只需在asp.net应用程序中使用Guid作为令牌。

流程可能是这样的:

  1. 用户请求为其帐户重置密码
  2. 通过将PasswordResetExpiration设置为将来的日期(DateTime.Now.AddDays(1)),在表中插入新记录(或更新其用户记录),并将令牌设置为Guid.NewGuid()< / LI>
  3. 使用查询字符串中的guid(http://www.yoursite.com/ResetPassword.aspx?token=Guid-here
  4. 向用户发送指向ResetPassword.aspx页面的链接
  5. 使用ResetPassword.aspx页面验证令牌和到期字段。 (I.E.确保DateTime.Now&lt; PasswordResetExpiration)
  6. 提供一个允许用户重置此密码的简单表单。
  7. 我知道你想避免修改数据库,但它确实可能是最简单的方法。

答案 1 :(得分:2)

@Alex

您还可以在.NET中使用System.Security.Cryptography类作为哈希算法。例如:

using System.Security.Cryptography;
...
var hash = SHA256CryptoServiceProvider.Create().ComputeHash(myTokenToHash);
...

答案 2 :(得分:1)

这里是你朋友的System.Guid类,因为它会产生一个独特的(好的,足够独特的)128位数字:

  • 生成新的Guid(System.Guid.NewGuid())
  • 将Guid存储在某个地方(可能是应用程序对象?)
  • 使用该Guid
  • 在电子邮件中发送自定义网址
  • 当用户点击网站时,请让他们输入您在电子邮件中发送的密码
  • 如果密码匹配,请继续并强制他们输入新密码

答案 3 :(得分:1)

我使用Hashing Class创建由当前日期/时间和用户电子邮件地址组成的独特自动登录:

string strNow = DateTime.Now.ToString();
string strHash = strNow + strEmail;
strHash = Hash.GetHash(strHash, Hash.HashType.SHA1);

http://www.developerfusion.com/code/4601/create-hashes-md5-sha1-sha256-sha384-sha512/

获取哈希类

然后使用以下命令从URL中获取它:

if (Request.QueryString["hash"] != null)
{
                //extract Hash from the URL
                string strHash = Request.QueryString["hash"];
}

答案 4 :(得分:1)

我肯定会在此过程中包含数据库。请求重置后,最好指出该帐户已被锁定。

例如,如果您因为认为自己的帐户遭到入侵而更改了自己的权限,那么在进行变更流程时,您绝对不希望它仍然可以访问。

此外,包括&#34;真实&#34;如果某人真的想要它并具有马力,则可以解码重置令牌中的信息。生成随机字符串会更安全,将其保存在该用户的行中的db中,然后在单击链接时键回到它。

这给你两件事:

1)没有任何东西可以解密,因此无法从中获得任何价值。 2)用户记录中存在令牌表示正在进行重置,并且该帐户应被视为已锁定。

答案 5 :(得分:0)

向用户电子邮件发送一些数据字符串的目标是验证帐户所有者。请关注一些要点:

  • 避免在重置或激活链接时发送重要信息。
  • 这是与用户一起存储唯一字符串数据的最佳方式 帐户并将其作为该链接发送。但请注意,如果你只发一个 部分作为用户电子邮件的链接,只需在页面中查看,您的 申请可能是蛮力或字典危险的 攻击者。它足以检查字符串列表以找到一些链接 并更改密码。我知道这有一点机会,但不是零。

结果: 我认为如果你更好

  1. 将用户电子邮件与字符串链接相结合,然后加密它们 (不散列,因为散列值不能反转)并发送给用户 电子邮件。
  2. 用户点击,您的页面会获得加密值。
  3. 解密价值。
  4. 提取用户电子邮件。
  5. 在数据库中查找电子邮件。
  6. 将收到的链接中的字符串与附加到用户的其他链接进行比较 数据库中的电子邮件。
  7. 祝你好运。

答案 6 :(得分:0)

我会使用哈希码来验证密码重置网址中的详细信息。这一切都可以在不向DB写任何内容或向任何人发送任何特权信息的情况下完成。

简要说明正常密码盐和散列;说盐是1111而密码是password,你要连接两个并散列字符串1111password,比如说这给你一个9999的哈希值,你' d然后将原始盐1111和哈希9999存储在您的用户记录中。

当您验证密码时,您使用存储的salt,连接密码尝试,哈希并与存储的哈希进行比较。例如,asecret变为1111asecret,但哈希值为8888。这与原始哈希不匹配,因此密码匹配失败。

当然,salt和hash通常会使用已建立的加密库正确生成和计算(不要发明自己的!)。

对于密码重置URL,我将输入用户的唯一标识符,即电子邮件地址,请求的日期和新的哈希值。这个哈希值将从连接在一起的那些细节以及已经为用户存储的salt和hash生成。

例如:

Email: user@example.com
Request Date: 2014-07-17
Salt: 1111
Hash: 9999

生成连接的新哈希值,即'user@example.com2014-07-1711119999',假设这给出了7777的哈希值。

然后我生成的URL将包含电子邮件,请求日期和新哈希:

https:\\www.example.com\ResetPassword?email=user@example.com&requestdate=2014-07-17&hash=7777

服务器将电子邮件和提供的日期与它的salt和hash结合起来,并确认它生成的哈希与提供的哈希相同。如果这是好的,那么它将显示重置表单,其后面隐藏着相同的三个参数,否则出错。输入新密码时会重新提交并重新检查这些密码,以防止该表单被欺骗。

需要提供电子邮件地址才能发出请求,并且只能通过电子邮件发送到同一地址。日期几乎没有priveleged信息和散列不可逆,所以无论如何什么都没有。没有任何内容写入数据库,任何对参数的篡改都会导致哈希失败,并且URL会报告错误。

答案 7 :(得分:0)

此方法存在问题。一个安全的哈希使令牌真的很长。您可以将盐添加到哈希表本身中(使其长度增加约20个字符),也可以将该唯一的盐存储在数据库中。如果您将盐存储在数据库中,则还可以存储不是从任何现有

派生的随机令牌

答案 8 :(得分:-5)

根据您的需要,您可以采用与以下格式类似的格式加密信息

(UserId)-(ExpireDate)

加密数据,制作链接,然后解密数据并从那里采取行动......

原油,但很可能是可用的,不需要使用数据库