Токен сброса пароля идентификации ASP.NET - PullRequest
0 голосов
/ 04 ноября 2019

Когда я пытаюсь сбросить пароль, я получаю "Неверный токен"

Токен перед отправкой: cBcZbiN8LO9+ aIVMbegaj1k5IYrJ3fBOKJ / WSH0NZZUgguSgWOFANoVOMp8y5b / 481AP / mpnusV1YlmXQ1zFQmi4S / 7xYMtRn3IeSIviEWmuxwPF8O41Y1pFQ1tF8GAaw5D4 / Y9 + olZvII / kh5W8RGn4JT9wrOz / qwtdnYXbYxmjp4i20mLzXWqs9ewVUKIo8FZ + 7mXP + sKYKk + e754tLw ==

1010 * Токен получено: cbczbin8lo9 +aivmbegaj1k5iyrj3fbokj / wsh0nzzuggusgwofanovomp8y5b / 481ap / mpnusv1ylmxq1zfqmi4s / 7xymtrn3iesiviewmuxwpf8o41y1pfq1tf8gaaw5d4 / y9 + olzvii / kh5w8rgn4jt9wroz / qwtdnyxbyxmjp4i20mlzxwqs9ewvukio8fz + 7mxp + skykk + e754tlw == 1016 * Как вы можете видеть, единственное отличие состоит в том, что по какой-то причине, есть буквы Верхниекогда он был сгенерирован, и он был изменен на нижний регистр, вероятно, вызванный действиями HttpUtility.UrlEncode / HttpUtility.UrlDencode?

Забыли пароль:

string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = HttpUtility.UrlEncode(code) }, protocol: Request.Url.Scheme);
await UserManager.SendEmailAsync(user.Id, "Reset Password", string.Format("Please reset your password by clicking <a href='{0}'>here</a>", callbackUrl));

Сброс пароля

var code = HttpUtility.UrlDecode(model.Code);
var result = await UserManager.ResetPasswordAsync(user.Id, code, model.Password);

Любая идея, чтовызывает это?

Спасибо

1 Ответ

0 голосов
/ 04 ноября 2019

Я попытался использовать кодирование / декодирование в моем собственном аналогичном проекте, и токен вернулся в контроллер, как и предполагалось. Таким образом, в моем тесте не возникает та же самая «ошибка».

С учетом вышесказанного вам не нужно самостоятельно кодировать токен, asp.net закодирует для вас строку токена и расшифрует ее. когда он получен снова, через callbackurl. Просто используйте токен напрямую:

var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);

На приемном конце также не декодируйте его. (пропустите эту строку) var code = HttpUtility.UrlDecode(model.Code);

Просто передайте model.Code прямо в метод UserManager, вот так, и все должно работать нормально. asp.net будет иметь дело с кодировками для вас

var result = await UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password);

Пример:.

1015 * Оригинальный Токен oFO0xxL7tLoW7Rfz1Yh2Bblim4x2Yn + 6O7FXqwz7NPyRyr80EA9LNjsv + BdCDsTHnJx9nkOpnb + vcoEVczZmL2qnqBxAYQQoCnsgobbQVFEHkoAJi0mhDb5stDIP / XytN8qu5d9EUIOUL5IT + 9snciG4SQNSp4 / x8T5m1wrLmblEyuvH8 /VAwX1S5V + cJpkK8fGSmHunzziwamxt1ERB7A == 1019 * Url.Action будет кодировать это и вставить в виде ссылки в электронной почте oFO0xxL7tLoW7Rfz1Yh2Bblim4x2Yn% 2B6O7FXqwz7NPyRyr80EA9LNjsv% 2BBdCDsTHnJx9nkOpnb% 2BvcoEVczZmL2qnqBxAYQQoCnsgobbQVFEHkoAJi0mhDb5stDIP% 2FXytN8qu5d9EUIOUL5IT% 2B9snciG4SQNSp4% 2Fx8T5m1wrLmblEyuvH8% 2FVAwX1S5V% 2BcJpkK8fGSmHunzziwamxt1ERB7A% 3D%3D

Разница + / и == будут кодироваться как% 2B (+)% 2F (/) и% 3D (=)

* ** тысяча тридцать три * тысяча тридцать четыре декодируется asp.net, прежде чем передается контроллер oFO0xxL7tLoW7Rfz1Yh2Bblim4x2Yn + 6O7FXqwz7NPyRyr80EA9LNjsv + BdCDsTHnJx9nkOpnb + vcoEVczZmL2qnqBxAYQQoCnsgobbQVFEHkoAJi0mhDb5stDIP / XytN8qu5d9EUIOUL5IT + 9snciG4SQNSp4 / x8T5m1wrLmblEyuvH8 / VAwX1S5V + cJpkK8fGSmHunzziwamxt1ERB7A ==

То же, что и исходный токен.

...