关于在 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 其他框架方法并帮助完成其余工作。
对于名称等“额外”信息,请使用ASP.NET Profiles 用户电子邮件地址应该是唯一的。 用户应创建自己的帐户。
    管理员不应直接创建新帐户。 密码和安全答案应该只有用户知道。 在激活帐户之前,应发送生成的密钥(以 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 中实现忘记密码功能的一些问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Asp.Net mvc5 Identity 1.0.0 版中忘记密码

在 asp.net MVC 中实现超级用户功能?

在 ASP.NET MVC 中实现“记住我”功能

如何在 ASP.NET MVC 5 中实现自定义身份验证

如何在 Spring mvc 中实现忘记密码

使用 ASP.NET 身份重置密码时令牌无效