13

我正在构建 ASP.NET MVC 4 应用程序。我使用 Simple Membership 提供程序来管理系统内的身份验证和授权。在这种方法中更改密码的方法是什么。我找到了一个 ChangePassword 方法,它需要三个参数,包括原始密码,来操作。

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

4

2 回答 2

18

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

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

  var token = WebSecurity.GeneratePasswordResetToken("UserName");
  var result = WebSecurity.ResetPassword(token, "NewPassword");
于 2013-01-10T16:29:05.010 回答
4

这里有一篇关于如何在 MVC 4 中使用 SimpleMembership 实现密码重置/更改的详细文章。它还包括您可以下载的源代码。

此示例使用电子邮件向用户发送 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 的链接,该 Web 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");
}
于 2013-12-12T15:32:20.767 回答