重置密码功能会生成无效令牌

时间:2016-09-26 03:20:03

标签: c# passwords token reset

我正在尝试在我的Web API中开发重置密码功能。电子邮件生成在Rest Web Service(Web API)中执行。一旦用户收到带链接的生成电子邮件,当他点击链接时,用户应该被重定向到驻留在MVC网站中的ResetPasswordPage(网页不在Web API中,它在我的同事开发的网站中)驻留在不同的港口。 当我点击ResetPassword页面时,它会打开Reset Password Web页面..然后我点击Submit按钮,我收到一条'Invalid Token'消息。

Web API(REST Web服务)代码如下

string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
            code = HttpUtility.UrlEncode(code);
            string forgotPasswordHost = System.Configuration.ConfigurationManager.AppSettings["ForgotPasswordURL"];
            string forgotPasswordURL = Url.Route("URLApi", new {controller = "ResetPassword", userId = user.Id, code = code });
            try
            {
                //await UserManager.SendEmailAsync(user.Id, "Reset Password", $"{url}");
                await UserManager.SendEmailAsync(user.Id, "Reset Password", "Please reset your password by clicking <a href=\"" + forgotPasswordHost + forgotPasswordURL + "\">here</a>");
            }
            catch (Exception e)
            {
                return new Status
                {
                    status = "Invalid Input"
                };
            }

单击该URL,将转到网站

中的以下代码
[AllowAnonymous]
        public ActionResult ResetPassword(string 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();
        }

点击电子邮件链接后,网页就会打开。但我注意到,当网页被打开并且页面被提交后,'_RequestVerificationToken'的值是不同的。 任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

找到答案。我参考了以下链接: http://www.gunaatita.com/Blog/Invalid-Token-Error-on-Email-Confirmation-in-Aspnet-Identity/1056

这是由Web API和MVC生成的机器密钥造成的。在Web API和MVC上配置相同的机器密钥解决了“无效令牌”问题。