Декодировать строку со знаком плюс - PullRequest
2 голосов
/ 06 января 2020

Использование ASP. NET Ядро Я получаю следующий токен (упрощенно):

String token = "Z%2F3+3Q==";

Код / кодируется с использованием %2F. Я получил токен с URL-адреса, вызываемого на клиенте с помощью Angular.

. Я попытался декодировать токен с помощью следующего:

HttpUtility.UrlDecode(token)

Или

WebUtility.UrlDecode(token)

В обоих случаях %2F заменяется на /, который я хочу, но + заменяется пробелом, который мне не нужен.

Как декодировать строку?

Обновление

Клиентское приложение отправляет кодированный токен:

Z%2F3%2B3Q%3D%3D;

Но, каким-то образом, он кажется токеном в следующем действии:

[HttpPut("account/verify/{userId}/{token}")]
public async Task<IActionResult> VerityEmailAddress([FromRoute]AccountEmailVerifyModel model) {
}

Преобразуется в:

Z%2F3+3Q==

Таким образом, + и = декодируются, а / - нет.

1 Ответ

2 голосов
/ 07 января 2020

Ключевым моментом здесь является то, что он передается как параметр маршрута , а указанный c символ, который не был должным образом декодирован, является /. Как вы можете себе представить, существуют некоторые потенциальные проблемы при работе с / в параметрах маршрута, поскольку они обычно рассматриваются как разделители маршрутов.

В конечном итоге, это известное ограничение с ASP. NET MVC Framework и теперь ASP. NET Core . На сайте ASP. NET GitHub довольно много обсуждений. На # 4599 (с 2016 года) ведутся долгие споры о том, является ли это правильным поведением. В # 4445 (с июня) сотрудник Microsoft обязуется , предоставляя возможность разрешить декодирование этих параметров , но это не привело к ASP . NET Core 3.1 , и теперь он предназначен для ASP. NET 5.0 как PRI: 1 - Требуется выпуск.

Пока Microsoft не предоставит решение этой проблемы, существует три варианта обхода поведения:

  1. Вместо этого передайте параметр {token} через строку запроса, где он будет полностью декодирован.
  2. Добавьте в свое приложение код, который явно декодирует %2F после того, как произошла привязка .
  3. Создайте собственный IModelBinder для изменения самого поведения привязки модели.

Ничто из этого не приносит особого удовлетворения. Но это по крайней мере подтверждает, что поведение, которое вы видите, известно и ожидаемо, даже если оно возможно некорректно.

...