C# 我应该如何实施;“忘记密码”;在ASP.NETMVC中?

C# 我应该如何实施;“忘记密码”;在ASP.NETMVC中?,c#,asp.net-mvc,membership,C#,Asp.net Mvc,Membership,我正在使用ASP.NET MVC演示中附带的标准SqlMembershipProvider 我对在我的网站上实现“忘记密码”链接感兴趣 实现此功能的正确方法是什么?我是否应该用临时密码覆盖密码并通过电子邮件发送到他们的注册电子邮件?提供商将自动为您重置: 该示例只是将新密码返回到浏览器,而不是通过电子邮件发送给用户,但使用了可由提供程序配置的机密问题/答案 此示例获取密码并通过电子邮件发送: 我认为这两种方法都是安全的。电子邮件it步骤更安全,因为用户必须知道问题/答案和电子邮件密码才能破解

我正在使用ASP.NET MVC演示中附带的标准SqlMembershipProvider

我对在我的网站上实现“忘记密码”链接感兴趣


实现此功能的正确方法是什么?我是否应该用临时密码覆盖密码并通过电子邮件发送到他们的注册电子邮件?

提供商将自动为您重置:

该示例只是将新密码返回到浏览器,而不是通过电子邮件发送给用户,但使用了可由提供程序配置的机密问题/答案

此示例获取密码并通过电子邮件发送:

我认为这两种方法都是安全的。电子邮件it步骤更安全,因为用户必须知道问题/答案和电子邮件密码才能破解帐户


我知道这些示例没有使用MVC,但我确信这足以让您继续使用。:)

根据应用程序的性质,忘记密码的最佳实践应按以下顺序进行

  • 允许用户验证机密/问题最多3到5次
  • 验证成功后,发送一封带有随机生成密码的电子邮件,有效期为24小时
  • 电子邮件必须仅包含密码,而不能同时包含用户名/密码
  • 当用户使用临时密码登录时,必须强制用户在进入主页之前创建新密码

  • 当然,最好是通过电子邮件向用户发送一个带有某种不可能猜到的URL的链接(例如包含随机Guid)。当用户单击URL时,他们可以重置密码。该URL只能用于一次,并且应在设定的时间后过期。

    这取决于您使用的成员资格提供商的类型。 但我建议使用简单的成员资格提供程序进行身份验证,以了解更多细节

    这里有一些代码给你

    [HttpPost]
    [AllowAnonymous]
    public ActionResult ForgotPassword(ForgotPasswordModel model)
        {
          .
          .
          .  
          .
                    if (WebSecurity.UserExists(model.UserName))
                    {
                   var token = WebSecurity.GeneratePasswordResetToken(model.UserName, 60);
                      .
                      .
                      .
                      .                        
                        // send this token by email
                    }
                    else
                    {
                        ModelState.AddModelError("", "Could not find User");
                    }
                }
          return View(model);
    
    
        }
    
     [HttpPost]
         public ActionResult ResetPassword( ResetPasswordModel model)
        {
            string token = Request.Params["token"];
            if (!string.IsNullOrEmpty(token))
            {
                if (WebSecurity.ResetPassword(token, model.NewPassword))
                {
            // send email…….. or                                          
                    return View();
                }
            }