在web api和身份c#中获取无效的令牌重置密码时间?

时间:2017-04-10 12:27:19

标签: c# asp.net-web-api

我正在使用.net MVC c#在web API和身份中创建一个重置密码的小型演示。我点击忘记密码使用查询字符串在邮件中发送一个代码。在邮件代码是正确的获取。现在我要更改密码并从URL获取代码中的代码没有得到令牌'=='最后一端没有获取并获得错误无效令牌如何解决这个错误任何人都知道?

这是我在帐户控制器中的ForgotPassword方法:

  public async Task<IHttpActionResult> ForgotPassword(ForgotPasswordViewModel model)
    {

        try
        {
            var user = await UserManager.FindByNameAsync(model.Email);

            if (user == null)
            {
                return Ok();
            }

            // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
            // Send an email with this link
            string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
            await UserManager.SendEmailAsync(user.Id, "Reset Password",Request.RequestUri.GetLeftPart(UriPartial.Authority) + "/home/ChangePassword?Code=" + code);
            return Ok("Ok");
        }
        catch (Exception ex)
        {
            ExceptionsLogging.SendExcepToDB(ex);
            throw new HttpException(500, ex.Message);
        }
    }

这是我的ResetPasswordMethod:

  public async Task<IHttpActionResult> ResetPassword(ChangePasswordBindingModel model)
    {
        try
        {                
            var user = await UserManager.FindByNameAsync(model.Email);
            if (user == null)
            {
                // Don't reveal that the user does not exist
                return Ok();
            }
            var result = await UserManager.ResetPasswordAsync(user.Id, model.Code, model.NewPassword); // here not getting code propare 
            if (result.Succeeded)
            {
                return Ok("Done");
            }
            return Ok();
        }
        catch (Exception ex)
        {
            ExceptionsLogging.SendExcepToDB(ex);
            throw new HttpException(500, ex.Message);
        }
    }

任何人都知道如何解决它我尝试编码/解码但现在得到propare

1 个答案:

答案 0 :(得分:3)

您必须在发送电子邮件之前对生成的令牌进行编码

string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
var encodedCode = HttpUtility.UrlEncode(code);
await UserManager.SendEmailAsync(user.Id, "Reset Password",Request.RequestUri.GetLeftPart(UriPartial.Authority) + "/home/ChangePassword?Code=" + encodedCode);
return Ok("Ok");