在我的MVC和Web API项目中,我正在使用ASP.NET身份验证进行登录。
以下是AccountController上的忘记密码功能:
以下是AccountController上的忘记密码功能:
[HttpPost]
[AllowAnonymous]
[Route("ForgotPassword")]
public async Task<IHttpActionResult> ForgotPassword(ForgotPasswordViewModel model)
{
if (ModelState.IsValid)
{
var user = await UserManager.FindByNameAsync(model.Email);
if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id)))
return Ok();
try
{
var code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
var callbackUrl = new Uri(@ "http://MyProject/ResetPassword?userid=" + user.Id + "&code=" + code);
string subject = "Reset Password";
string body = "Please reset your password by clicking <a href=\"" + callbackUrl + "\">here</a>";
SendEmail(user.Email, callbackUrl, subject, body);
}
catch (Exception ex)
throw new Exception(ex.ToString());
return Ok();
}
// If we got this far, something failed, redisplay form
return BadRequest(ModelState);
}
我已经收到确认邮件,并成功重定向到“重置密码”视图,但是我不确定如何继续。
以下是如何使用以下参数重置密码的步骤:NewPssword,ConfirmPassword和Code?
我尝试调用SetPassword
方法,但遇到401错误。
self.resetPassword = function () {
var data = {
Email: self.loginUserName(),
NewPassword: self.registerPassword(),
ConfirmPassword: self.registerPassword2()
}
$.ajax({
type: 'POST',
url: '../API/Account/SetPassword',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(data),
complete: showError
});
}
还有setPassword函数:
// POST api/Account/SetPassword
[Route("SetPassword")]
public async Task<IHttpActionResult> SetPassword(SetPasswordBindingModel model)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
IdentityResult result = await UserManager.AddPasswordAsync(User.Identity.GetUserId(), model.NewPassword);
if (!result.Succeeded)
return GetErrorResult(result);
return Ok();
}
当前的流程如下:
- 用户点击“忘记密码”链接。
- 他被重定向到“忘记密码”视图,该视图只有一个字段:电子邮件。
- 用户提供他的电子邮件地址并提交表单。
- 请求被发送到“忘记密码”函数。
- 一封包含唯一代码的电子邮件将被发送给客户端。
到这里,我编写了代码并使其正常工作,但我不确定如何实现下一步:
- 用户被重定向到“重置密码”视图,该视图具有3个字段:电子邮件、新密码和确认密码。
- 用户提交表单,请求被发送到“设置密码”函数 (?),使用唯一代码重置了用户的密码。
谢谢您的帮助。
ForgotPassword
行为并且它是有效的,但是你没有发布SetPassword
行为,而你又说它返回一个错误。通过你发布的这两个片段很难准确地告诉你错误出在哪里。 - JamieD77User.Identity.GetUserId()
将无效。 - JamieD77UserManager
中至少有2.0版本,应该有一个方法Microsoft.AspNet.Identity.UserManager.ResetPasswordAsync(TKey userId, string token, string newPassword)
。 - JamieD77