使用asp.net身份验证的忘记密码

3
在我的MVC和Web API项目中,我正在使用ASP.NET身份验证进行登录。
以下是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();
}

当前的流程如下:

  1. 用户点击“忘记密码”链接。
  2. 他被重定向到“忘记密码”视图,该视图只有一个字段:电子邮件。
  3. 用户提供他的电子邮件地址并提交表单。
  4. 请求被发送到“忘记密码”函数。
  5. 一封包含唯一代码的电子邮件将被发送给客户端。

到这里,我编写了代码并使其正常工作,但我不确定如何实现下一步:

  1. 用户被重定向到“重置密码”视图,该视图具有3个字段:电子邮件、新密码和确认密码。
  2. 用户提交表单,请求被发送到“设置密码”函数 (?),使用唯一代码重置了用户的密码。

谢谢您的帮助。

1个回答

4
听起来你的 SetPassword API 应该调用:
var user = await UserManager.FindByNameAsync(model.Email);
if (user != null)
{
    var result = await UserManager.ResetPasswordAsync(user.Id, model.Code, model.NewPassword);
    if (result.Succeeded)
    {
          //handle success
    }
}
//handle invalid    

你必须发布相关的代码才能获得准确的答案。你已经发布了ForgotPassword 行为并且它是有效的,但是你没有发布SetPassword行为,而你又说它返回一个错误。通过你发布的这两个片段很难准确地告诉你错误出在哪里。 - JamieD77
你是正确的,我编辑了我的问题,非常感谢你的帮助! - user3378165
如果您要重置密码,似乎应该使用 ResetPassword 方法而不是 SetPassword。原因是,在重置密码时,您实际上没有登录,因此 User.Identity.GetUserId() 将无效。 - JamieD77
UserManager中至少有2.0版本,应该有一个方法Microsoft.AspNet.Identity.UserManager.ResetPasswordAsync(TKey userId, string token, string newPassword) - JamieD77
在VS2013的默认MVC模板中,AccountController中有一个示例。 - JamieD77
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接