Подтвердить что ты не робот

Почему Url.IsLocalUrl возвращает false, если URL-адрес содержит фрагмент?

Я использую Url.IsLocalUrl, чтобы проверить, является ли возвращаемый URL-адрес, переданный моему действию аутентификации, локальным или нет. Он отлично работает, пока в URL-адресе нет фрагмента. То есть, /t/test-team-3/tasks/lists/15 возвращает true, но /t/test-team-3/tasks#/lists/15 возвращает false.

Каковы причины этого? Есть ли какая-то непонятная проблема безопасности, которая может проявиться во фрагменте, или я могу смело игнорировать фрагмент, когда проверяю, является ли URL локальным?

4b9b3361

Ответ 1

Этот метод внутренне вызывает метод Uri.IsWellFormedUriString. Когда вы вызываете этот метод на относительном URL-адресе, содержащем фрагмент, он возвращает false. Существует ошибка в MS Connect, которая закрыта по соображениям дизайна.

Когда вы используете этот метод на абсолютном URL (со схемой, подобной http/https), метод ведет себя так, как ожидалось. Я думаю, причина в том, что класс Uri предназначен для работы не только с URL-адресами HTTP. Если вы не укажете протокол (относительный URL), используется общий парсер URL-адресов, который не допускает фрагменты.

Итак, у вас есть две возможности:

  • Разделите фрагмент перед вызовом метода
  • Вызовите метод по абсолютному URL (http://foo.com/t/test-team-3/tasks#/lists/15), так как в любом случае, если вы вызываете этот метод по относительному URL-адресу, мы можем ожидать, что это локальный URL-адрес.