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. 用户提交表单,请求被发送到带有唯一代码的 SetPassword 函数 (?),并且用户的密码被成功重置。

提前致谢。

4

1 回答 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    
于 2016-08-01T18:09:46.683 回答