Я попытался использовать кодирование / декодирование в моем собственном аналогичном проекте, и токен вернулся в контроллер, как и предполагалось. Таким образом, в моем тесте не возникает та же самая «ошибка».
С учетом вышесказанного вам не нужно самостоятельно кодировать токен, 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 ==
То же, что и исходный токен.