此代码在电子邮件中发送令牌
[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)时代码相同。
所以我真的很困惑。这里有很多解决方案但是空代码或不同代码存在唯一的问题。我有很好的代码,仍然是错误的无效令牌。
请有人提出任何意见吗?
答案 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);
所以我生成电子邮件令牌并检查密码令牌。
当我改变它时,一切正常!