Ошибка 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/

Хотя это не ваша проблема, у нас были проблемы, идентичные описанным вами. Нашим решением было:

  1. Включена базовая аутентификация в IIS (это ничего не решало, но требовалось для следующих 2 шагов)
  2. Отключите проверку подлинности Windows в IIS (это решило проблему для некоторых браузеров IE, но не для всех)
  3. Отключить анонимный доступ в 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);
        }
    }
Другие вопросы по тегам