用asp.net身份忘记密码

时间:2016-08-01 17:49:15

标签: asp.net-mvc asp.net-web-api knockout.js asp.net-identity reset-password

在我的MVC和Web API项目中,我使用ASP.NET Identity进行登录。

这是我在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. 正在向客户发送包含唯一代码的电子邮件。
  6. 直到这里我编写了代码并将其付诸实践,但我不确定如何实施后续步骤:

    1. 用户被重定向到包含3个字段的重置密码视图:电子邮件,新密码和确认密码。
    2. 用户提交表单,正在使用唯一代码向SetPassword函数(?)发送请求,并且用户密码正在成功重置。
    3. 提前致谢。

1 个答案:

答案 0 :(得分: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    
相关问题