通过电子邮件恢复/重置丢失的密码选项

我正在使用DefaultMembershipProvider开发一个C#ASP.MVC 4项目,我正在尝试用一种用户友好的方式来恢复/重置丢失的密码。

我的第一次尝试是让用户提供他们的用户名(这是一个有效的电子邮件地址),然后应用程序将生成随机密码(符合我们的要求),然后将密码通过电子邮件发送给用户。

我的理想解决方案是当用户点击忘记密码按钮时。 系统会询问他们的用户名,这些用户名在提供时会导致电子邮件与URL一起发送(此URL也会附加到期日期)。 此解决方案还会重置应用程序内的用户密码(在发送电子邮件之前)。 当用户点击URL时,他们会自动登录并发送到更改密码表单。 这个解决方案有问题吗?

对于配置,我设置了以下值:

      

首先,这里有两个必须阅读[我再说一遍,必读]:

  1. 您想要了解的有关构建安全密码重置function的所有内容
  2. 您可能错误地存储密码

话虽如此,OWASP有一些关于如何实现身份validation的指导,您可以开始使用他们的身份validation备忘单,并为您的特定情况启动忘记密码备忘单 。 这也可以说是必读的。 如果你不打算关注OWASP,我希望这是因为你决定,而不是因为你不知道更好。

无论如何,最好的摘要是后面的图像(从上面的第一个链接获取),如果你只想记住一件事,就这样:

密码重置工作流程

您的方法存在缺陷 – 您写道发送电子邮件会重置用户密码。 假设滥用者知道登录信息,这很容易被任何人重置为任何用户重置密码。 换句话说,我只需点击“我不记得我的密码”并提供用户名,就可以坐在您的系统前面并阻止其他用户的帐户。

所以,你不必重置任何东西。 该方法将为解锁请求(可以是数据库中的表)创建存储,其中每个请求由guid识别并具有到期日期,用户名和标记是否已使用请求的标记。 当您发送电子邮件时,您在此请求存储中创建一条记录,并且该电子邮件包含指向guid的链接(请注意,解锁电子邮件中不需要其他信息)。

然后,当有人点击他们的电子邮件中的链接时,在服务器端,您就有了请求的指示。 从您的请求存储区中,您可以读取过期日期,用户名以及之前使用过该链接的信息。 然后,您将呈现用户提供其新密码的表单。

与您的方法相比,这具有不干扰现有密码的优点。 此外,隐藏服务器端的所有信息并仅向用户公开guid具有不向客户端暴露潜在敏感信息的优点(如链接到期日期)。