关于在 asp.net mvc 中实现忘记密码功能的一些问题
Posted
技术标签:
【中文标题】关于在 asp.net mvc 中实现忘记密码功能的一些问题【英文标题】:Some questions regarding implementing forgot password functionality in asp.net mvc 【发布时间】:2011-07-28 19:26:38 【问题描述】:我想在asp.net mvc中实现一个忘记密码功能,允许用户重置密码,对此有一些疑问:
假设在允许用户重置密码之前,我想验证一些额外的信息,例如他们的名字和姓氏。默认情况下,此信息不存储在 aspnet_regsql 创建的表中。解决此类问题的推荐方法是什么?我应该将这种信息存储在单独的表中,并使用表连接来验证还是应该修改由 aspnet_regsql 生成的表的架构(如何?),这样我就不必使用连接?我需要编写自定义提供程序还是不需要?
我在一些地方读过书,例如在这个post 中,不是通过电子邮件发送临时密码,而是通过电子邮件发送一个 URL,当单击该 URL 时,用户可以更改他们的密码。这是怎么做到的?如何确保网址在 1 小时后过期?
【问题讨论】:
【参考方案1】:我不知道这是否是推荐的方法,但您可以像您提到的那样创建一个单独的表,然后实现您自己的会员资格提供程序。这样,您可以在密码重置时实现所需的附加功能。
第二部分: 我会生成一个令牌,阅读有关生成它的各种方法here。您可以存储带有日期/时间的令牌,将带有令牌的链接作为 URL 的一部分通过电子邮件发送给用户,然后一旦用户单击它,您就可以根据经过的时间量来检查它。
【讨论】:
【参考方案2】:对于您提出的问题,我可以详细地写几个答案。实现细节的内容太多了,但我会尝试触及我在设计网站时牢记的要点。基本上,您可以(并且应该)与成员资格提供者合作,而不是绕过它。这需要一些工作,但可以使用提供程序和 ASP.NET MVC 完成以下所有操作。
避免直接访问成员资格表或执行成员资格存储过程。-
它们的结构和用法在旧版本或新版本中可能有所不同。
已经建立了提供程序来执行大多数任务。
LINQ 其他框架方法并帮助完成其余工作。
-
管理员不应直接创建新帐户。
密码和安全答案应该只有用户知道。
在激活帐户之前,应发送生成的密钥(以 URL 的形式)以验证给定电子邮件地址的所有权。
-
Provide good questions from which to choose.
不要强迫或信任用户临时想出一个好问题。
只有知道当前密码才能更改问题/答案。
-
可以通过正确回答安全问题来重置。
如果还忘记了安全答案或帐户被锁定,可以通过管理操作重置。
-
生成的临时密码将发送到帐户上的电子邮件地址。临时的意思:
设置了一个标志(配置文件值)以指示用户在下次登录后必须设置新密码。
密码在设定的时间后过期。
管理员可以重置密码,但永远不应该知道密码。
必须使用第二个提供程序定义来完成(请参阅ASP.Net User forgot answer to password question)
如有必要,应同时解锁帐户。
-
失败的尝试已在提供程序中进行计数和配置。
可以选择在经过足够的时间后自动解锁帐户。
如果我想到更多,我会扩展它。
【讨论】:
感谢贾斯汀的 cmets。 asp.net 团队在asp.net/security/tutorials 整理了一套优秀的教程。特别是,本教程asp.net/security/tutorials/… 解决了此处提出的问题 #1。引用文章:将这三列添加到数据库中的一个新表中,并在该表和aspnet_Users之间建立一对一的关系。这种方法比使用 Profile 框架需要更多的工作,但在如何为其他用户属性建模方面提供了最大的灵活性......以上是关于关于在 asp.net mvc 中实现忘记密码功能的一些问题的主要内容,如果未能解决你的问题,请参考以下文章