Asp.net mvc 忘记使用asp.net标识的密码

Asp.net mvc 忘记使用asp.net标识的密码,asp.net-mvc,asp.net-web-api,knockout.js,asp.net-identity,reset-password,Asp.net Mvc,Asp.net Web Api,Knockout.js,Asp.net Identity,Reset Password,在我的MVC和web API项目中,我使用ASP.NET标识进行登录 这是AccountController上的“忘记密码”功能: [HttpPost] [AllowAnonymous] [Route("ForgotPassword")] public async Task<IHttpActionResult> ForgotPassword(ForgotPasswordViewModel model) { if (ModelSt

在我的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);
    }
和设置密码功能:

// 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();
    }
//POST-api/Account/SetPassword
[路由(“设置密码”)]
公共异步任务SetPassword(SetPasswordBindingModel模型)
{
如果(!ModelState.IsValid)
{
返回请求(ModelState);
}
IdentityResult result=await UserManager.AddPasswordAsync(User.Identity.GetUserId(),model.NewPassword);
如果(!result.successed)
{
返回GetErrorResult(结果);
}
返回Ok();
}
目前,流程如下所示:

  • 用户点击“忘记密码”链接
  • 他被重定向到忘记密码视图,该视图有一个字段:Email
  • 用户提供其电子邮件地址并提交表单
  • 请求被发送到忘记密码功能
  • 正在向客户端发送带有唯一代码的电子邮件
  • 在此之前,我编写了代码并开始工作,但我不确定如何实现接下来的步骤:

  • 用户被重定向到重置密码视图,该视图有3个字段:电子邮件、新密码和确认密码
  • 用户提交表单后,将向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
    操作,您说该操作返回错误。。通过你发布的两个片段很难告诉你到底是什么错了。你是对的,我编辑了我的问题,非常感谢你的帮助!如果要重置密码,似乎应该使用ResetPassword方法而不是SetPassword。。原因是,在重置密码时,您实际上没有登录,因此
    User.Identity.GetUserId()
    将无效,但asp.net Identity默认情况下不提供重置密码功能。你知道我在哪里可以找到它的样品吗?非常感谢。
    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