关于在asp.net mvc实现忘记密码功能的一些问题

4

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

  1. 假设在允许用户重置密码之前,我想要验证一些额外的信息,比如他们的名字和姓氏。这些信息默认情况下不会存储在由aspnet_regsql创建的表中。应该如何处理这种情况?是将这种信息存储在单独的表中,并使用表连接进行验证,还是修改由aspnet_regsql生成的表的架构(如何修改),以便不必使用连接?需要编写自定义提供程序吗,还是不需要?

  2. 我在某些地方阅读到过,例如在这个帖子中,与其发送临时密码电子邮件,另一种选择是发送一个URL,当用户单击该URL时,可以更改他们的密码。这是如何完成的?如何确保URL在1小时后过期?

2个回答

4
我可以详细写出几个回答你提出的问题。有太多的细节需要涉及,但我会尝试强调在设计网站时所考虑的要点。基本上,你可以(而且应该)使用Membership提供程序而不是绕过它。这需要一些工作,但是可以使用提供程序和ASP.NET MVC完成以下所有操作。
  • 避免直接访问会员表或执行会员存储过程。
    1. 它们的结构和用法可能在旧版或新版中不同。
    2. 提供程序已经建立以执行大部分任务。
    3. LINQ和其他框架方法可以帮助完成其余工作。
  • 对于“额外”的信息,例如名称,请使用ASP.NET Profiles
  • 用户电子邮件地址应该是唯一的。
  • 用户应该创建自己的帐户。
    1. 管理员不应直接创建新帐户。
    2. 密码和安全答案只能由用户知道。
    3. 在激活帐户之前,应发送生成的密钥(以URL形式)以验证所给电子邮件地址的所有权。
  • 实现安全问题和答案,Membership提供程序已经支持。
    1. 提供好的问题供选择。
    2. 不要强迫或信任用户即兴想出一个好问题。
    3. 只有知道当前密码才能更改问题/答案。
  • 忘记密码
    1. 通过正确回答安全问题来重置。
    2. 如果也忘记了安全答案或帐户被锁定,则可以通过管理操作来重置。
  • 重置密码应该意味着:
    1. 生成的临时密码将发送到帐户上的电子邮件地址。 临时意味着:
      • 设置标志(Profile值)以指示用户必须在下次登录后设置新密码。
      • 密码在一定时间后过期。
    2. 管理员可以重置密码,但不应知道密码。
  • 在太多次密码或安全答案尝试失败后锁定帐户。
    1. 已经在提供程序中计算和配置了失败的尝试次数。
    2. 可以选择在足够的时间过去后自动解锁帐户。

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


感谢Justin的评论。 asp.net团队在http://www.asp.net/security/tutorials上提供了一组优秀的教程。特别是,这个教程http://www.asp.net/security/tutorials/storing-additional-user-information-cs解决了这里提出的问题#1。引用文章中的内容:在数据库中的一个新表中添加这三列,并在此表和aspnet_Users之间建立一对一关系。与Profile框架相比,这种方法需要更多的工作,但在如何对额外的用户属性进行建模方面提供了最大的灵活性... - morpheus

2
我不知道这是否是推荐的方法,但您可以创建一个单独的表格,就像您提到的那样,然后实现自己的成员资格提供程序。这样,在重置密码时,您可以实现所需的附加功能。 对于第二部分: 我会生成一个令牌,阅读各种生成方式 在这里。您可以将令牌与日期/时间一起存储,向用户发送包含令牌的链接作为 URL 的一部分,然后您将能够根据经过的时间量检查它,一旦用户点击它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,