通过电子邮件恢复/重置丢失的密码选项
我正在使用DefaultMembershipProvider开发一个C#ASP.MVC 4项目,我正在尝试用一种用户友好的方式来恢复/重置丢失的密码。
我的第一次尝试是让用户提供他们的用户名(这是一个有效的电子邮件地址),然后应用程序将生成随机密码(符合我们的要求),然后将密码通过电子邮件发送给用户。
我的理想解决方案是当用户点击忘记密码按钮时。 系统会询问他们的用户名,这些用户名在提供时会导致电子邮件与URL一起发送(此URL也会附加到期日期)。 此解决方案还会重置应用程序内的用户密码(在发送电子邮件之前)。 当用户点击URL时,他们会自动登录并发送到更改密码表单。 这个解决方案有问题吗?
对于配置,我设置了以下值:
首先,这里有两个必须阅读[我再说一遍,必读]:
- 您想要了解的有关构建安全密码重置function的所有内容
- 您可能错误地存储密码
话虽如此,OWASP有一些关于如何实现身份validation的指导,您可以开始使用他们的身份validation备忘单,并为您的特定情况启动忘记密码备忘单 。 这也可以说是必读的。 如果你不打算关注OWASP,我希望这是因为你决定,而不是因为你不知道更好。
无论如何,最好的摘要是后面的图像(从上面的第一个链接获取),如果你只想记住一件事,就这样:
您的方法存在缺陷 – 您写道发送电子邮件会重置用户密码。 假设滥用者知道登录信息,这很容易被任何人重置为任何用户重置密码。 换句话说,我只需点击“我不记得我的密码”并提供用户名,就可以坐在您的系统前面并阻止其他用户的帐户。
所以,你不必重置任何东西。 该方法将为解锁请求(可以是数据库中的表)创建存储,其中每个请求由guid识别并具有到期日期,用户名和标记是否已使用请求的标记。 当您发送电子邮件时,您在此请求存储中创建一条记录,并且该电子邮件包含指向guid的链接(请注意,解锁电子邮件中不需要其他信息)。
然后,当有人点击他们的电子邮件中的链接时,在服务器端,您就有了请求的指示。 从您的请求存储区中,您可以读取过期日期,用户名以及之前使用过该链接的信息。 然后,您将呈现用户提供其新密码的表单。
与您的方法相比,这具有不干扰现有密码的优点。 此外,隐藏服务器端的所有信息并仅向用户公开guid具有不向客户端暴露潜在敏感信息的优点(如链接到期日期)。
- Page.User.Identity与Request.LogonUserIdentity之间的差异
- 如何从ASP.NET MVC自定义IdentityUser模型获取用户配置文件数据?
- 使用MySql MySQLMembershipProvider – autogenerateschema =“true”不起作用?
- 需要将Asp.Net Identity(RTM)用户ID从nvarchar(128)更改为uniqueidentifier
- 更改成员资格,角色等的默认连接字符串
- 将Membership.GetAllUsers()强制转换为通用列表时出现NotSupportedException
- Membership.GetUser()。ProviderUserKey始终返回null
- 如何设置asp.net认证的属性
- ASP.NET中的自定义角色