4

我想在 asp.net mvc 中实现一个忘记密码的功能,允许用户重置他们的密码,并在这方面有一些问题:

  1. 假设在允许用户重置密码之前,我想验证一些额外的信息,例如他们的名字和姓氏。默认情况下,此信息不存储在 aspnet_regsql 创建的表中。解决此类问题的推荐方法是什么?我应该将这种信息存储在单独的表中,并使用表连接来验证还是应该修改由 aspnet_regsql 生成的表的架构(如何?),这样我就不必使用连接?我是否需要编写自定义提供程序或者这不是必需的?

  2. 我在一些地方读到过,例如在这篇文章中,不是通过电子邮件发送临时密码,而是通过电子邮件发送一个 URL,当单击该 URL 时,用户可以更改他们的密码。这是怎么做到的?如何确保 URL 在 1 小时后过期?

4

2 回答 2

4

对于你提出的问题,我可以详细写几个答案。实现细节的内容太多了,但我会尝试触及我在设计网站时牢记的要点。基本上,您可以(并且应该)与成员资格提供者合作,而不是绕过它。这是一些工作,但可以使用提供程序和 ASP.NET MVC 完成以下所有操作。

  • 避免直接访问成员表或执行成员存储过程。
    1. 它们的结构和用法在旧版本或新版本中可能有所不同。
    2. 提供者已经建立以执行大多数任务。
    3. LINQ 的其他框架方法并帮助完成其余的工作。
  • 对于名称等“额外”信息,请使用ASP.NET 配置文件
  • 用户电子邮件地址应该是唯一的。
  • 用户应创建自己的帐户。
    1. 管理员不应直接创建新帐户。
    2. 密码和安全答案应该只有用户知道。
    3. 在激活帐户之前,应发送生成的密钥(以 URL 的形式)以验证给定电子邮件地址的所有权。
  • 实施会员资格提供者已经支持的安全问题和答案。
    1. 提供可供选择的好问题。
    2. 不要强迫或信任用户临时想出一个好问题。
    3. 只有知道当前密码才能更改问题/答案。
  • 忘记密码
    1. 可以通过正确回答安全问题来重置。
    2. 如果安全答案也被遗忘或帐户被锁定,可以通过管理操作重置。
  • 重置密码应该意味着:
    1. 生成的临时密码将发送到帐户上的电子邮件地址。临时的意思:
      • 设置标志(配置文件值)以指示用户必须在下次登录后设置新密码。
      • 密码在设定的时间后过期。
    2. 管理员可以重置密码,但永远不应该知道密码。
  • 密码或安全答案尝试失败次数过多后锁定帐户。
    1. 失败的尝试已在提供程序中进行计数和配置。
    2. 可以选择在经过足够的时间后自动解锁帐户。

如果我想到更多,我会扩展这个。

于 2011-04-09T08:17:35.277 回答
2

我不知道这是否是推荐的方法,但您可以像您提到的那样创建一个单独的表,然后实现您自己的成员资格提供程序。这样,在密码重置时,您可以实现所需的附加功能。

对于第二部分:我会生成一个令牌,请在此处阅读各种生成它的方法。您可以存储带有日期/时间的令牌,将带有令牌的链接作为 URL 的一部分通过电子邮件发送给用户,然后一旦用户单击它,您就可以根据经过的时间量来检查它。

于 2011-04-03T22:00:13.553 回答