ASP.NET令牌错误重置密码

时间:2017-01-18 13:59:15

标签: asp.net asp.net-mvc-5 forgot-password reset-password

我只是在我的项目中添加MVC 5的“忘记密码”部分,收到电子邮件后我无法更改密码。

错误:在App => Image of error in the app

在Visual Studio中=> Image of error visual studio

错误来自的代码:

 public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }
        var user = await UserManager.FindByEmailAsync(model.Email);
        if (user == null)
        {
            // Don't reveal that the user does not exist
            return RedirectToAction("ResetPasswordConfirmation", "Account");
        }
        var code = model.Code.Replace(" ","+");
        **var result = await UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password);**
        if (result.Succeeded)
        {
            return RedirectToAction("ResetPasswordConfirmation", "Account");
        }
        AddErrors(result);
        return View();
    }

我在stackoverflow和其他方面尝试了很多东西,但它没有用。

如果您知道我为什么会收到此错误:)

我使用在visual studio中创建ASP.NET Web应用程序时提出的基本模板。 我可以上传你想要的所有代码文件,只要问你需要什么来帮助我,我会在2分钟内上传它!

由于

3 个答案:

答案 0 :(得分:1)

我的问题非常相似,但碰巧是我的路由引擎将所有网址转换为小写(对于搜索引擎优化等)。我需要确保查询字符串参数允许混合大小写。 Base64使用混合大小写。

我为每个控制器方法添加了NoLowercaseQueryString属性。这特定于MVC Boilerplate project

答案 1 :(得分:0)

假设您使用的是默认模板,您可能会使用下面的代码来生成callbackUrl

string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);

您需要在将code(令牌)发送到电子邮件之前对其进行网址编码,即将其更改为code = HttpUtility.UrlEncode(code)

您不需要此行var code = model.Code.Replace(" ","+");

希望这有帮助。

答案 2 :(得分:0)

我弄清楚问题是什么,

我的callbackUrl具有令牌特殊字符和upperCase

的格式

首先在ForgotPasswordViewModel中,我手动生成了我的URL,然后我将其编码为正确

            string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
            code = System.Web.HttpUtility.UrlEncode(code);
            string datcode = code;
            //var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
            var datUrl = "http://localhost:62989/Account/Resetpassword?" + user.Id + "&Code=" + code;

对于upperCase问题,我在将callbackurl分配给我的emai消息时忘记了ToTitleCase方法,所以我删除了它。

            message = message.Replace("@ViewBag.Name", CultureInfo.CurrentCulture.TextInfo.ToTitleCase(usernom));
            message = message.Replace("@ViewBag.CallBackUrl", datUrl);
            await MessageServices.SendEmailAsync(model.Email, emailSubject, message);

其次,我是ResetPasswordViewModel,我用

解码令牌
var code = WebUtility.UrlDecode(model.Code);

用原始的+,

替换空格
code = code.Replace(' ', '+');

最后,它在ResetPasswordAsync功能中运行良好!

var result = await UserManager.ResetPasswordAsync(user.Id, code, model.Password);

感谢@Ravi的帮助