生成临时URL以重置密码

Pra*_*ari 28 passwords url reset

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

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

通过电子邮件临时密码重置密码

谢谢.

Sco*_*son 67

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

PasswordResetToken UNIQUEIDENTIFIER,
PasswordResetExpiration DATETIME
Run Code Online (Sandbox Code Playgroud)

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

流程可能是这样的:

  1. 用户请求为其帐户重置密码
  2. 通过将PasswordResetExpiration设置为将来的日期(DateTime.Now.AddDays(1)),在表中插入新记录(或更新其用户记录),并将令牌设置为Guid.NewGuid()
  3. 通过查询字符串中的guid向用户发送指向ResetPassword.aspx页面的链接(http://www.yoursite.com/ResetPassword.aspx?token=Guid-here)
  4. 使用ResetPassword.aspx页面验证令牌和到期字段.(IE确保DateTime.Now <PasswordResetExpiration)
  5. 提供一个允许用户重置此密码的简单表单.

我知道你想避免修改数据库,但它可能是最简单的方法.

  • 安全说明:UNIQUEIDENTIFIER并非旨在提供随机性,并且在这种情况下是不安全的。基本上,您需要一个无法猜测的重置链接。为了使您无法猜测您的重置链接,您需要包括一个由加密安全的随机数生成器生成的随机数,而GUID则不是。因此,除了第2列之外,您还需要第3列来存储将用作密码的随机数,最后您将GUID和密码作为参数发送到reset链接中。 (2认同)

Mit*_*ers -3

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

(UserId)-(ExpireDate)
Run Code Online (Sandbox Code Playgroud)

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

粗糙,但很可能可用,并且不需要使用数据库

  • 将任何数据包含到密码重置令牌中都是不好的做法。事件(如果已加密)。了解该算法的黑客即使无法访问用户的邮箱,也能够为任何用户重置密码。 (32认同)
  • @SlavaNadvorny 黑客还需要知道加密算法的密钥。您可以假设,如果黑客有权访问加密密钥,他可能也有权访问存储的哈希值,所以是的,这种技术似乎仍然是一个好主意。 (5认同)
  • -1。这个想法在某种意义上是好的,但由于 Slava 在之前的评论中解释的安全问题,不应该使用它。 (3认同)
  • 该技术的真正问题在于它无法阻止同一重置令牌的多次使用。 (3认同)