Похоже, что вызов Url.IsLocalUrl (returnUrl) дает разные результаты, учитывая то, что кажется одинаковым значением для returnUrl.Как это возможно?
Структура таргетинга приложений MVC 4.7.1.В попытке предотвратить атаки с открытым перенаправлением, у меня есть код ниже.Довольно просто и универсально.
Когда я пытаюсь перейти на нашу целевую страницу без входа в систему, и меня перенаправляют обратно на страницу входа, мой URL-адрес: https://ourdomain.com/I/Login?ReturnUrl=%2fI%2fHome. Когда я вхожу,URL, по которому я нахожу себя: https://ourdomain.com/I/Home. Отлично.Как и ожидалось.Это работает для 99,9 +% наших пользователей, в противном случае нас бы затопили ошибки, а мы нет.
Однако у нас есть хотя бы один пользователь, который получает ошибку здесь.В наших журналах ошибок говорится: «Обнаружена атака открытого перенаправления. Пользователь собирался войти в систему, а затем был возвращен:% 2fI% 2fHome.»
Мой рабочий returnUrl и тот, что в наших журналах ошибок, совпадают, и это работает 99,9 +% времени для того же значения.Я не могу воспроизвести ошибку самостоятельно.Почему в редких случаях это приводит к другим результатам?Заранее спасибо за любые предложения!
if (!string.IsNullOrWhiteSpace(returnUrl) && !Url.IsLocalUrl(returnUrl))
{
throw new Exception($"An open redirection attack was detected. User was going to login and then be returned to: {returnUrl}.");
}