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

时间:2019-04-24 20:02:48

标签: c# asp.net security encryption

我正在设计ASP.NET应用程序中的一些“忘记密码”功能,并且对保护用户可以重置其密码的端点的最佳方法存在疑问。

我如何想象它的工作原理(大致)如下:

  • 用户在登录表单上单击“忘记密码”
  • 用户被带到一个屏幕,他们将在其中输入与帐户相关联的电子邮件
  • 然后将用户带到一个屏幕,他们可以在其中回答一些安全问题(我公司要求)
  • 正确回答问题后,将向用户发送一封包含链接的电子邮件。
  • 用户单击电子邮件中的链接,这将带他们进入密码重置表单

我的问题是,如何确保当有人到达此密码重设表单时,他们单击该电子邮件链接即可到达那里,而不仅仅是手动输入URL到达那里?

我想到的一种解决方案是加密一些数据,并将其作为参数附加到电子邮件内的URL中。因此,当他们单击该链接时,我可以解密数据并确保数据来自有效电子邮件,然后再提供表单。但是我不确定执行此操作的最佳方法。

1 个答案:

答案 0 :(得分:1)

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

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