C# 如何正确保护忘记密码端点

C# 如何正确保护忘记密码端点,c#,asp.net,security,encryption,C#,Asp.net,Security,Encryption,我正在一个ASP.NET应用程序中设计一些忘记密码功能,并且有一个关于保护用户可以重置密码的端点的最佳方法的问题 我(大致)认为这是如何起作用的: 用户单击登录表单上的“忘记密码” 用户将进入一个屏幕,在那里他们将输入与其帐户关联的电子邮件 然后,用户被带到一个屏幕,在那里他们可以回答一些安全问题(我的公司要求) 正确回答问题后,将向用户发送一封包含链接的电子邮件 用户单击其电子邮件中的链接,将进入密码重置表单 我的问题是,我如何确保当有人到达此密码重置表单时,他们是通过单击该电子邮件链接到

我正在一个ASP.NET应用程序中设计一些忘记密码功能,并且有一个关于保护用户可以重置密码的端点的最佳方法的问题

我(大致)认为这是如何起作用的:

  • 用户单击登录表单上的“忘记密码”
  • 用户将进入一个屏幕,在那里他们将输入与其帐户关联的电子邮件
  • 然后,用户被带到一个屏幕,在那里他们可以回答一些安全问题(我的公司要求)
  • 正确回答问题后,将向用户发送一封包含链接的电子邮件
  • 用户单击其电子邮件中的链接,将进入密码重置表单
我的问题是,我如何确保当有人到达此密码重置表单时,他们是通过单击该电子邮件链接到达的,而不是手动键入URL到达的


我想到的一个解决方案是加密一些数据并将其作为参数附加到电子邮件中的URL中。因此,当他们点击该链接时,我可以解密数据,并确保在提供表单之前数据来自有效的电子邮件。但我不确定最好的方法是什么。

解决方案包括创建一个可在重置页面上使用一次的令牌。您通过电子邮件发送类似于
https://example.com/PasswordLost?token=467dc4ad9acf4
,然后站点检查令牌是否有效,并显示密码更改页面。为了增加安全性,可以及时限制令牌的有效性:大约十分钟就足够了。一旦使用,令牌将不再可用

有许多方法可以生成令牌。您可以生成一个随机字符串,并将其存储在数据库中,其中包含关联的电子邮件地址和令牌的过期日期。然后,您可以通过查询数据库来验证它。我更喜欢的另一种解决方案是生成一个由服务器加密的令牌。然后,您可以对其进行解密并验证其包含的数据(用户电子邮件和过期日期、上次密码更改日期)。这样,您就不必在服务器上存储任何内容。这是什么


您可以阅读我的博文以了解更多信息。

您听说过吗?@grooveplex我没有,这可能正是我需要的。您如何描述它,这正是我们公司的做法,除了我们还让加密密钥在15分钟后过期,以防止它永远坐在那个人的收件箱中等待黑客发现。这基本上就是我最后做的,但使用JSON web令牌。谢谢