Недействительный токен на reset пароле с идентификатором ASP.NET
Я реализовал идентификатор ASP.NET в моем приложении MVC, скопировав код из шаблонов VS 2013. Основная вещь работает, но я не мог заставить пароль Reset работать. Когда я показываю страницу "забытый пароль", создается электронное письмо, содержащее токен. Этот токен возвращается методом:
UserManager.GeneratePasswordResetTokenAsync(user.Id)
Когда я нажимаю ссылку, открываются формы пароля Reset и позволяет пользователю вводить свой адрес электронной почты и новый пароль. Затем выполняется вызов функции изменения пароля:
UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password);
Это выглядит хорошо для меня, но результатом всегда является "Invalid Token", и я не понимаю, почему это так.
Есть ли у кого-нибудь идея, почему он не работает? И где, черт возьми, хранится токен? Я думал, что это должно быть в базе данных где-то вокруг таблицы AspNetUsers
...
Ответы
Ответ 1
Токен, сгенерированный UserManager
в ASP.NET Identity, обычно содержит символы "+
", которые при передаче в виде строки запроса преобразуются в "
" (пробел) в URL-адресе. В ResetPassword ActionResult замените "
" на "+
" следующим образом:
var code = model.Code.Replace(" ", "+");
//And then change the following line
UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password);
//To this one so it uses the code(spaces replaced with "+") instead of model.Code
UserManager.ResetPasswordAsync(user.Id, code, model.Password);
Это должно сделать трюк.
У меня была та же проблема и нашла ответ здесь.
Ответ 2
Просто хотелось добавить, что наиболее распространенная проблема за пределами кодирования/декодирования HTML заключается в том, что в вашей записи пользователя в базе данных может отсутствовать SecurityStamp. В ASP.NET Identity есть ошибка, когда одна функция устанавливает ее в null при создании токена, тогда как другая, когда проверка маркера проверяет пустую строку.
Если ваш SecurityStamp имеет значение null или пустую строку, это приведет к ошибке недопустимого маркера.
Ответ 3
В моем случае это произошло потому, что данные в базе данных были импортированы из другой базы данных неправильно. Поле SecurityStamp
было null, поэтому я получил недопустимую ошибку токена.