Проблема с символом «+» в строке токена, закодированной в URL-адресе, в приложении ASP.NET Core и Angular ⇐ C#
Проблема с символом «+» в строке токена, закодированной в URL-адресе, в приложении ASP.NET Core и Angular
У меня возникла проблема со строками, закодированными в URL-адресе, в моем приложении ASP.NET 8 Core и Angular 17, особенно при обработке функции сброса пароля. Проблема возникает с символом «+» в строке токена, закодированной в URL.
Бэкэнд (ASP.NET Core): У меня есть две конечные точки API: ForgotPassword и ResetPassword. В ForgotPassword генерируется токен, кодируется URL-адрес и отправляется на электронную почту пользователя. В ResetPassword токен декодируется и используется для сброса пароля пользователя.
// Конечная точка ForgotPassword // ... Код для генерации сброса токена ... вар encodedToken = HttpUtility.UrlEncode(resetToken); var resetLink = $"{frontendBaseUrl}/account/reset-password?token={encodedToken}&date={encodedDate}&email={HttpUtility.UrlEncode(user.Email)}"; дождитесь SendResetPasswordEmail (пользователь, resetLink); // ... Дополнительный код ... // конечная точка сброса пароля вар decodedToken = dto.Token.DecodeUrlAndRestorePluses(); результат вар = ждут _userManager.ResetPasswordAsync (пользователь, decodedToken, dto.NewPassword); // ... Дополнительный код ... Фронтенд (Angular): В своем компоненте Angular я извлекаю токен из URL-адреса и передаю его методу resetPassword:
// Извлечение токена, адреса электронной почты и даты из URL-адреса this.route.queryParams.subscribe(params => { this.token = params['токен']; this.email = params['email']; this.date = params['date']; }); // метод сброса пароля this.accountService.resetPassword(this.token, this.date, this.email, newPassword) .подписаться( /* ... */ ); Проблема: Если в токене присутствует символ +, где-то в процессе он преобразуется в пробел ( ). Это приводит к сбою проверки токена с ошибкой «неверный токен». Я уже пробовал использовать HttpUtility.UrlDecode и WebUtility.UrlDecode, но проблема не устранена.
Я добавил метод расширения DecodeUrlAndRestorePlus для решения этой проблемы, который, кажется, работает, но я не уверен, что это лучший подход.
публичная статическая строка DecodeUrlAndRestorePluses (эта строка закодированаString) { вар decodedString = HttpUtility.UrlDecode(encodedString); return decodedString.Replace(" ", "+"); } Вопросы:
[*]Почему символ + преобразуется в пробел и где может происходить это преобразование? [*]Есть ли более стандартный или фундаментальный способ решения этой проблемы без необходимости использования специального метода расширения? [*]Есть ли какие-либо потенциальные подводные камни или проблемы с безопасностью при моем нынешнем подходе?
Будем очень признательны за любые идеи или альтернативные решения этой проблемы.
У меня возникла проблема со строками, закодированными в URL-адресе, в моем приложении ASP.NET 8 Core и Angular 17, особенно при обработке функции сброса пароля. Проблема возникает с символом «+» в строке токена, закодированной в URL.
Бэкэнд (ASP.NET Core): У меня есть две конечные точки API: ForgotPassword и ResetPassword. В ForgotPassword генерируется токен, кодируется URL-адрес и отправляется на электронную почту пользователя. В ResetPassword токен декодируется и используется для сброса пароля пользователя.
// Конечная точка ForgotPassword // ... Код для генерации сброса токена ... вар encodedToken = HttpUtility.UrlEncode(resetToken); var resetLink = $"{frontendBaseUrl}/account/reset-password?token={encodedToken}&date={encodedDate}&email={HttpUtility.UrlEncode(user.Email)}"; дождитесь SendResetPasswordEmail (пользователь, resetLink); // ... Дополнительный код ... // конечная точка сброса пароля вар decodedToken = dto.Token.DecodeUrlAndRestorePluses(); результат вар = ждут _userManager.ResetPasswordAsync (пользователь, decodedToken, dto.NewPassword); // ... Дополнительный код ... Фронтенд (Angular): В своем компоненте Angular я извлекаю токен из URL-адреса и передаю его методу resetPassword:
// Извлечение токена, адреса электронной почты и даты из URL-адреса this.route.queryParams.subscribe(params => { this.token = params['токен']; this.email = params['email']; this.date = params['date']; }); // метод сброса пароля this.accountService.resetPassword(this.token, this.date, this.email, newPassword) .подписаться( /* ... */ ); Проблема: Если в токене присутствует символ +, где-то в процессе он преобразуется в пробел ( ). Это приводит к сбою проверки токена с ошибкой «неверный токен». Я уже пробовал использовать HttpUtility.UrlDecode и WebUtility.UrlDecode, но проблема не устранена.
Я добавил метод расширения DecodeUrlAndRestorePlus для решения этой проблемы, который, кажется, работает, но я не уверен, что это лучший подход.
публичная статическая строка DecodeUrlAndRestorePluses (эта строка закодированаString) { вар decodedString = HttpUtility.UrlDecode(encodedString); return decodedString.Replace(" ", "+"); } Вопросы:
[*]Почему символ + преобразуется в пробел и где может происходить это преобразование? [*]Есть ли более стандартный или фундаментальный способ решения этой проблемы без необходимости использования специального метода расширения? [*]Есть ли какие-либо потенциальные подводные камни или проблемы с безопасностью при моем нынешнем подходе?
Будем очень признательны за любые идеи или альтернативные решения этой проблемы.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Проблема PHP MySql со специальным символом из другой закодированной таблицы
Anonymous » » в форуме Php - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Проблема PHP MySql со специальным символом из другой закодированной таблицы
Anonymous » » в форуме Php - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-