Недействительный токен на 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, поэтому я получил недопустимую ошибку токена.