在MVC 4中更改密码

时间:2013-01-10 16:20:16

标签: asp.net-mvc authentication simplemembership

我正在构建ASP.NET MVC 4应用程序。我使用简单成员资格提供程序来管理系统内的身份验证和授权。在这种方法中更改密码的方法有哪些。我发现了一个ChangePassword方法,该方法需要三个参数,包括原始密码才能运行。

在没有真正知道原始密码的情况下,是否有其他方法可以覆盖/更改用户的密码?

2 个答案:

答案 0 :(得分:18)

当用户想要更改密码时使用ChangePassword - 并且当前密码是他们允许这种情况发生的证据(想想更改密码屏幕)。

我认为最直接的方法是调用WebSecurity.GeneratePasswordResetToken()并将结果与​​新密码一起传递给WebSecurity.ResetPassword。

  var token = WebSecurity.GeneratePasswordResetToken("UserName");
  var result = WebSecurity.ResetPassword(token, "NewPassword");

答案 1 :(得分:4)

有一篇关于how to implement password reset/change with SimpleMembership in MVC 4 here的详细文章。它还包括您可以下载的源代码。

此示例使用电子邮件向用户发送URL以单击以重置密码。这比让用户直接在网站上输入旧密码和新密码更安全,因为这是用户的另一个验证。这缓解了某人获取用户密码并通过更改密码将其锁定的情况。这也允许用户在忘记密码的情况下重置密码。

使用链接发送电子邮件的代码看起来像这样。

[AllowAnonymous]
[HttpPost]
public ActionResult ResetPassword(ResetPasswordModel model)
{
    string emailAddress = WebSecurity.GetEmail(model.UserName);
    if (!string.IsNullOrEmpty(emailAddress))
    {
        string confirmationToken =
            WebSecurity.GeneratePasswordResetToken(model.UserName);
        dynamic email = new Email("ChngPasswordEmail");
        email.To = emailAddress;
        email.UserName = model.UserName;
        email.ConfirmationToken = confirmationToken;
        email.Send();

       return RedirectToAction("ResetPwStepTwo");
    }

    return RedirectToAction("InvalidUserName");
}

这会创建一个电子邮件,其中包含指向Web API的链接,该API接受该令牌作为传入的ID。当他们点击该链接时,它会点击此方法。

[AllowAnonymous]
public ActionResult ResetPasswordConfirmation(string Id)
{
    ResetPasswordConfirmModel model = new ResetPasswordConfirmModel() { Token = Id };
    return View(model);
}

此操作从查询字符串中获取令牌,并将其放入传递给视图的ResetPasswordConfirmationModel,该视图允许用户输入新密码。输入两次新密码以确保它们输入正确,这在页面上验证。当他们提交此信息时,他们将被带到此操作的POST版本,该版本实际上会重置密码。

[AllowAnonymous]
[HttpPost]
public ActionResult ResetPasswordConfirmation(ResetPasswordConfirmModel model)
{
    if (WebSecurity.ResetPassword(model.Token, model.NewPassword))
    {
        return RedirectToAction("PasswordResetSuccess");
    }
    return RedirectToAction("PasswordResetFailure");
}