无效的令牌PaswordReset ASP.Net与邮件和控制器中的相同代码

时间:2018-03-18 12:20:42

标签: asp.net asp.net-mvc

此代码在电子邮件中发送令牌

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model)
{
    if (ModelState.IsValid)
    {
        var user = await UserManager.FindByNameAsync(model.Email);
        if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id)))
        {
            return View("ForgotPasswordConfirmation");
        }

        var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
        var client = new SmtpClient(send is OK)

        { Credentials = new NetworkCredential("somemail", "pass"),EnableSsl = true };

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

        { From = new MailAddress("somemail"),Subject = "<h2>Reset pass<h2>", Body = " reset pass here : " + callbackUrl, IsBodyHtml = true };

        message.To.Add(model.Email);
        client.Send(message);

        return RedirectToAction("ForgotPasswordConfirmation", "Account");
    }
    return View(model);
}

抓住它并发送给View(我试过两种方式)

[HttpGet]
        [AllowAnonymous]
        public ActionResult ResetPassword(string code)
        {
            //return code == null ? View("Error") : View(new ResetPasswordViewModel { Code = code });
            return code == null ? View("Error") : View();
        }

结果是“无效令牌”。

[HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return View(model);
            }
            var user = await UserManager.FindByNameAsync(model.Email);
            if (user == null)
            {
                // Don't reveal that the user does not exist
                return RedirectToAction("ResetPasswordConfirmation", "Account");
            }

            var result = await UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password);
            if (result.Succeeded)
            {
                return RedirectToAction("ResetPasswordConfirmation", "Account");
            }
            AddErrors(result);
            return View();
        }

但为什么呢?在接管(字符串代码)和结束时(model.Code)发送(callbackUrl)时代码相同。

所以我真的很困惑。这里有很多解决方案但是空代码或不同代码存在唯一的问题。我有很好的代码,仍然是错误的无效令牌。

请有人提出任何意见吗?

2 个答案:

答案 0 :(得分:0)

你有

吗?
@Html.HiddenFor(x => x.Code) 

在你的重置表格?否则你的代码将无法到达最后一个ActionResult

答案 1 :(得分:0)

我有解决方案。这是我的错误。

我在这里制作了令牌

var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);

并点击此处

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

所以我生成电子邮件令牌并检查密码令牌。

当我改变它时,一切正常!