Ошибка ADFS v2.0: MSIS7042: в том же сеансе браузера клиента было выполнено "6" запросов за последние "1" секунды
Ребята, у меня есть приложение ASP.NET MVC, которое я пытаюсь защитить, используя версию ADFS v2.0 Release Candidate (Женева). Я настроил приложение как доверие проверяющей стороны и использовал Fedutil.exe, чтобы изменить файл Web.config приложения, чтобы он содержал информацию о сервере в Женеве и использовал сервер в качестве источника утверждений.
Однако, когда я пытаюсь запустить приложение MVC, оно перенаправляется в Женеву, которая затем (после предупреждения о самозаверяющих сертификатах) снова перенаправляет меня в приложение MVC. Приняв оба самозаверяющих сертификата предупреждения, два сервера играют в пинг-понг друг с другом в бесконечном цикле перенаправления, пока, наконец, Женева не выдаст следующее сообщение:
В том же сеансе браузера клиента было выполнено "6" запросов за последние "1" секунды. Возможна плохая конфигурация. Свяжитесь со своим администратором для деталей.
В журнале событий на стороне MVC или в Женеве нет ошибок, за исключением события, содержащего вышеуказанное сообщение. Если бы кто-то мог дать мне некоторую информацию о том, как попробовать и отладить, диагностировать и, надеюсь, решить эту проблему, я был бы вечно благодарен.
Опять же, Женевский блок - это кандидат на выпуск ADFS v2.0, а сайт ASP.NET MVC был создан с использованием последней (в конце '09) версии Windows Identity Foundation SDK с Web.config, измененным с помощью FedUtil.exe из WIF SDK.,
Так что вы все получите удовольствие от этого... Я попробовал это же приложение от Firefox и... ЭТО РАБОТАЕТ. Я получаю запрос на ввод учетных данных моего домена, сервер ADFS v2 перенаправляет меня ОДИН РАЗ, а затем я оказываюсь на домашней странице моего приложения с указанием имени учетной записи и персонализированного приветствия. Итак, теперь реальная проблема заключается в следующем: почему, черт возьми, IE8 попадает в бесконечный цикл перенаправления, а Firefox НЕ СДЕЛАЕТ?? После еще большего тестирования я смог получить этот сценарий без каких-либо изменений, без каких-либо изменений в конвейере по умолчанию из ADFS v2 (RC) или из WIF (RTW) в ОБА Safari AND Firefox. IE8 является ЕДИНСТВЕННЫМ браузером, который показывает любые проблемы, связанные с этим сценарием аутентификации. Я перепробовал все, в том числе установил и доверял самозаверяющим сертификатам, добавил сайты в мою локальную зону интрасети, снизил уровень безопасности и даже установил первые И сторонние куки, чтобы всегда разрешать.
5 ответов
Оказывается, имя хоста проверяющей стороны было подчеркнуто (khoffman_2). Очевидно, подчеркивание является недопустимым символом DNS, и ТОЛЬКО IE будет отклонять информацию с подчеркиванием в нем.
Я переименовал свою машину из khoffman_2 в khoffman2, и комбинация проверяющей стороны ADFS v2/MVC безупречно работает в Firefox, Safari и IE.
У меня была такая же проблема с ADFS 1.0. И чтобы решить ее, я убедился, что URL имеет косую черту "/", которая всегда будет работать как в FireFox, так и в IE.
например: https://somedomain.com/Application_2/
Хотя это не ваша проблема, у нас были проблемы, идентичные описанным вами. Нашим решением было:
- Включена базовая аутентификация в IIS (это ничего не решало, но требовалось для следующих 2 шагов)
- Отключите проверку подлинности Windows в IIS (это решило проблему для некоторых браузеров IE, но не для всех)
- Отключить анонимный доступ в IIS (это решило проблему для остальных браузеров IE)
Jaxidian ответ близок.
В моем случае мне нужно было только:
Аутентификация Windows -> Отключено
Анонимная авторизация -> включена
Олицетворение ASP.NET -> Отключено
Auth Forms -> Disabled
Проверка подлинности Windows -> Отключено
Этот цикл может происходить, когда пользователь не авторизован для доступа к странице.
У нас был собственный атрибут авторизации на нашем контроллере MVC, который проверяет, был ли пользователь в роли на основе предоставленных утверждений, если параметр UseADFS был истинным в файлах конфигурации. Я думал, что этот параметр был установлен в true и был сбит с толку тем, что я продолжал получать цикл adfs при доступе к странице, потому что я был в группах, которым был разрешен доступ к странице.
Ключом к устранению неполадок было создание веб-страницы, на которой отображались мои претензии adfs без обязательной аутентификации.
@if (User.Identity.IsAuthenticated)
{
<div>UserName: @User.Identity.Name;</div>
var claimsIdentity = User.Identity as System.Security.Claims.ClaimsIdentity;
<table>
@foreach (var claim in claimsIdentity.Claims)
{
<tr><td>@claim.Type</td><td>@claim.Value</td></tr>
}
</table>
}
Я заметил, что я вошел в ADFS, и мои требования были установлены, поэтому ADFS работал. Фактическая проблема заключалась в том, что мой конфигурационный файл имел UserADFS="true" вместо UseADFS="true", что в основном заставляло мой код авторизации возвращать false при авторизации. Поэтому страница продолжала пересылать меня обратно в adfs для повторной аутентификации.
В любом случае, если у пользователя нет правильных утверждений для доступа к странице, может также возникнуть этот цикл входа в систему adfs.
Кроме того, если вы написали собственный атрибут авторизации, обязательно посмотрите следующую ссылку, которая описывает, как предотвратить цикл.
Цикл перенаправления с атрибутом.Net MVC Authorize с утверждениями ADFS
Пользовательский код обработчика HandleUnauthorizedRequest для AuthorizeAttribute по этой ссылке:
protected override void HandleUnauthorizedRequest System.Web.Mvc.AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAuthenticated)
{
//One Strategy:
//filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
//Another Strategy:
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(
new
{
controller = "u",
action = "LoginStatus",
errorMessage = "Error occurred during authorization or you do not have sufficient priviliges to view this page."
})
);
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}