Вы также можете показать код из «ResetPassWord.cshtml»?
мASP.NET MVC Core 1.1.1
приложение сIndividual User Accounts
режим вVS2017 ver 15.3.3
Я реализуюForgot Password
функциональность. Приложение правильно отправляет письмо с сгенерированной ссылкой. Я могу открыть свою электронную почту и увидеть ссылку, сгенерированную следующим образом. Ссылка правильно отображаетResetPassWord.cshtml
Посмотреть. Но когда я ввожу требуемое имя пользователя, пароль, подтверждаю информацию о пароле и нажимаю кнопку «Отправить», я получаюInvalid Token
ошибка.Вопрос: Как решить проблему?
НОТА:
А.PasswordReset
функциональность работает нормально, если я вошел в систему и хочу сбросить пароль на что-то другое.
Б. Не уверен, что это актуально или нет: я не использую электронную почту в качестве имени пользователя. Вместо этого я изменил атрибуты электронной почты вAccountCountroller
из
[Required]
[EmailAddress]
public string Email { get; set; }
в
[Required]
public string UserName { get; set; }
и т. д. и т. д. и имеют расширенные атрибуты пользователя вApplicationUser.cs
следующее:
ApplicationUser.cs
// Add profile data for application users by adding properties to the ApplicationUser class
public class ApplicationUser : IdentityUser
{
public string UserFullName { get; set; }
[Column(TypeName = "varchar(50)")]
public string UserEmaill { get; set; }
[Column(TypeName = "varchar(15)")]
public string UserCity{ get; set; }
}
Тело моего письма, отправленного приложением:
Please reset your password by clicking here: <a href='http://localhost/HPF/Account/ResetPassword?userId=1db73091-8098-4427-9a1a-1897dcabea90&code=CfDJ8IgLyyEqB6dPkvwFmW%2BJlPrg%2Fpz%2FiNTD442K1KoBG7MSx3zp6TFSY5w0Xj49cG87P%2BkGSWalD6YbbRlrLP4qAEORuoaHZM%2BMe0G08Y9EeUycbhNxx%2FpEv2z3sJ%2BMr4ZccLBO08iwlbIxBnXkJ5gu%2Bsnoo5FHAKysp85%2FrLdbS47smj%2Bt9kaaFA5DDBkzmR%2Bb0HTV2FL8CyjH2M1wCjLgcSC2Jg6BIcDAVUd7jEwxB8V9upAVh%2FR3FJCk2OAJU4w4Fg%3D%3D'>link</a>
контроллер:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ForgotPassword(ForgotPasswordViewModel model)
{
if (ModelState.IsValid)
{
var user = await _userManager.FindByNameAsync(model.UserName);
string sUserEmail = user.UserEmail; //I Added this. Note the email is not the user name in my app
if (user == null)
{
// Don't reveal that the user does not exist or is not confirmed
return View("ForgotPasswordConfirmation");
}
// For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=532713
// Send an email with this link
var code = await _userManager.GeneratePasswordResetTokenAsync(user);
var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: HttpContext.Request.Scheme);
await _emailSender.SendEmailAsync(sUserEmail, "Reset Password", $"Please reset your password by clicking here: <a href='{callbackUrl}'>link</a>");
return View("ForgotPasswordConfirmation");
}
// If we got this far, something failed, redisplay form
return View(model);
}
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ResetPassword(ResetPasswordViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
var user = await _userManager.FindByNameAsync(model.UserName);
if (user == null)
{
// Don't reveal that the user does not exist
return RedirectToAction(nameof(AccountController.ResetPasswordConfirmation), "Account");
}
var result = await _userManager.ResetPasswordAsync(user, model.Code, model.Password);
if (result.Succeeded)
{
return RedirectToAction(nameof(AccountController.ResetPasswordConfirmation), "Account");
}
AddErrors(result);
return View();
}
ОБНОВИТЬ
Я пыталсяcode = System.Net.WebUtility.UrlEncode(code);
после линииvar code = await _userManager.GeneratePasswordResetTokenAsync(user);
внутриForgotPassword(...)
Метод POST; но все та же ошибка. Я тогда тоже попробовалvar code = System.Net.WebUtility.UrlDecode(model.Code);
до линииvar result = await _userManager.ResetPasswordAsync(user, code, model.Password);
внутриResetPassword(...)
Метод POST; та же ошибка снова.