0

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

错误:在应用程序中=>应用程序中的错误图像

在 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 分钟内上传!

谢谢

4

3 回答 3

1

我的问题非常相似,但恰好是我的路由引擎将所有 URL 转换为小写(用于 SEO 等)。我需要确保查询字符串参数允许大小写混合。Base64 使用大小写混合。

我将NoLowercaseQueryString属性添加到我的每个控制器方法中。这是特定于MVC Boilerplate 项目的。

于 2017-10-10T18:34:21.947 回答
0

我弄清楚是什么问题,

我的 callbackUrl 具有标记特殊字符和大写字母的格式

首先在 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;

对于大写问题,我在将 callbackurl 分配给我的电子邮件消息时忘记了 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 的帮助

于 2017-01-20T14:59:43.110 回答
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(令牌)发送到电子邮件之前对其进行 url 编码,即将其更改为code = HttpUtility.UrlEncode(code)

你不需要这条线var code = model.Code.Replace(" ","+");

希望这可以帮助。

于 2017-01-18T16:54:54.913 回答