Wiep Corbier Ответов: 1

У Webapi есть проблемы с некоторыми символами.


Поэтому у меня есть APIservice, который делает много вещей с данными.
Одна вещь, которую он делает, - это получает "кандидатов" по их регистрационным данным.

Такой код делает свою работу

[HttpGet]
        [Route("{name}/{password}/ByNameAndPassword")]
        public async Task<HttpResponseMessage> GetCandidateByNameAndPasswordAsync(string name, string password)
        {
            var candidate = await candidatesManager.GetCandidateByNameAndPasswordAsync(name, password);

            if (candidate.CandidateId != 0) { return Request.CreateResponse(System.Net.HttpStatusCode.OK, candidate); }
            else { return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Candidate with the requested credentials not found."); }
        }


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

Проблема возникает только с помощью Get.
Вставка данных не является проблемой.

Пример: когда я использую имя или пароль, содержащие следующий список символов, это не работает.

#
%
&усилитель;
*
:
"
'
&низкотемпературный;
>
?
/
.

Мой вопрос будет очевиден: почему это не работает, если один или несколько из этих персонажей участвуют в случае GET?

Что я уже пробовал:

Я пробовал все, что мог придумать, но у меня действительно больше нет идей.

1 Ответов

Рейтинг:
11

MadMyche

Что ж... проблема совершенно очевидна; многие из них являются различными управляющими или иными специальными символами.

То %, &, #, и / должен быть виден любому, кто рассматривал URL-адрес как разделители, идентификаторы фрагментов, маршрутизацию и escape-символы.


Лично я бы не стал использовать GET с паролем, так как он просто будет частью URL-адреса и подлежит кэшированию браузером и протоколированию в журналах сервера.
Решение может быть довольно уклончивым, чтобы найти; особенно если вы намерены сохранить это как метод GET.
В Net Framework вы можете работать с различными элементами в файле web.config, чтобы ослабить различные ограничения символов, я не знаю, как это сделать в среде Net.Core/Kestrel в настоящее время.
Надеюсь, что следующие ссылки на конфигурацию могут помочь вам
Смотреть здесь:
<system.web>
     <httpRuntime
А здесь:
<system.webServer>
     <security>
          <requestFiltering allowDoubleEscaping="true">


Wiep Corbier

Большое спасибо. Ты заставил меня увидеть свет и решение. Вместо GET я буду использовать POST (без фактического размещения, конечно)

Я публикую объект, содержащий имя и пароль.
На стороне сервера я делаю запрос, если кандидат существует, и возвращаю ответ.

MadMyche

Пожалуйста