我正在构建ASP.NET MVC 4应用程序。我使用简单成员资格提供程序来管理系统内的身份验证和授权。在这种方法中更改密码的方法有哪些。我发现了一个ChangePassword方法,该方法需要三个参数,包括原始密码才能运行。
在没有真正知道原始密码的情况下,是否有其他方法可以覆盖/更改用户的密码?
答案 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");
}