【问题标题】:Forgot Password with asp.net identity使用 asp.net 身份忘记密码
【发布时间】:2016-12-06 21:41:04
【问题描述】:

在我的 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?​​p>

对不起,如果这是一个愚蠢的问题,但我有点困惑。

我尝试调用 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 函数 (?) 发送请求,并且正在成功重置用户密码。

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    听起来你的 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 操作一个错误..您发布的 2 个 sn-ps 很难准确地告诉您出了什么问题。
    • 你说得对,我编辑了我的问题,非常感谢你的帮助!
    • 如果您正在重置密码,您似乎应该使用 ResetPassword 方法而不是 SetPassword。原因是,您在重置密码时实际上并没有登录,所以@ 987654324@ 无效
    • 但是 asp.net Identity 默认不提供 ResetPassword 功能。你知道我在哪里可以找到它的样品吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 2019-09-23
    • 2015-11-28
    • 1970-01-01
    • 2020-05-10
    相关资源
    最近更新 更多