6

我正在开发一个使用 DefaultMembershipProvider 的 C# ASP.MVC 4 项目,并且我试图想出一种用户友好的方式来恢复/重置丢失的密码。

我的第一次尝试是让用户提供他们的用户名(这是一个有效的电子邮件地址),然后应用程序会生成一个随机密码(满足我们的要求),然后将该密码通过电子邮件发送给用户。

我理想的解决方案是当用户单击忘记密码按钮时。他们被要求提供他们的用户名,当提供该用户名时,将发送一封带有 URL 的电子邮件(该 URL 也将附有到期日期)。此解决方案还重置应用程序内部的用户密码(在发送电子邮件之前)。当用户单击 URL 时,他们会自动登录并发送到更改密码表单。这个解决方案有问题吗?

对于配置,我设置了以下值:

<membership defaultProvider="DefaultMembershipProvider">
  <providers>
    <clear />
    <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" 
         enablePasswordRetrieval="false" 
         enablePasswordReset="true" 
         requiresQuestionAndAnswer="false" 
         requiresUniqueEmail="false" 
         maxInvalidPasswordAttempts="5" 
         minRequiredPasswordLength="6" 
         minRequiredNonalphanumericCharacters="0" 
         passwordAttemptWindow="10" 
         applicationName="/" />
  </providers>
</membership>
4

2 回答 2

6

首先,这里有两个必须阅读的内容[我重复一遍,必须阅读]:

  1. 您想知道的有关构建安全密码重置功能的所有信息
  2. 您可能错误地存储了密码

话虽如此,OWASP 有一些关于如何实施身份验证的指南,您可以从他们的身份验证备忘单开始,对于您的特定情况,您可以使用忘记密码备忘单。这也可以说是必读的。如果您不打算关注 OWASP,我希望这是因为您决定这样做,而不是因为您不了解更多信息。

无论如何,最好的摘要是下面的图像(取自上面的第一个链接),如果你只想记住一件事,那就这样吧:

密码重置工作流程

于 2012-11-11T10:15:08.990 回答
2

您的方法存在缺陷-您写道,发送电子邮件会重置用户密码。假设滥用者知道登录名,这将很容易被任何人滥用来为您的任何用户重置密码。换句话说,我只是坐在您的系统前,通过单击“我不记得我的密码”并提供他们的用户名来阻止其他用户的帐户。

因此,您无需重置任何内容。该方法将为解锁请求创建一个存储(可以是数据库中的一个表),其中每个请求都由一个 guid 标识,并具有一个到期日期、用户名和一个标志,以标记是否使用了请求。当您发送电子邮件时,您会在此请求存储中创建一条记录,并且电子邮件包含带有 guid 的链接(请注意,解锁电子邮件中不需要其他信息)。

然后,当有人单击其电子邮件中的链接时,在服务器端,您将获得请求的 guid。从您的请求存储中,您可以读取过期日期、用户名和信息(如果之前使用过该链接)。然后您提供一个表单,用户在其中提供他的新密码。

与您的方法相比,这具有不干扰现有密码的优点。此外,在服务器端隐藏所有信息并仅向用户公开 guid 具有不向客户端公开潜在敏感信息(如链接到期日期)的优点。

于 2012-11-11T10:01:48.520 回答