我正在尝试在我的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'的值是不同的。 任何帮助将不胜感激
答案 0 :(得分:0)
找到答案。我参考了以下链接: http://www.gunaatita.com/Blog/Invalid-Token-Error-on-Email-Confirmation-in-Aspnet-Identity/1056
这是由Web API和MVC生成的机器密钥造成的。在Web API和MVC上配置相同的机器密钥解决了“无效令牌”问题。