Искоренение 401 «несанкционированных» ответов, за которыми следуют 200 «ОК» ответов - PullRequest
23 голосов
/ 29 марта 2009

У меня возникла ситуация с большим внутренним корпоративным веб-приложением, работающим на ASP.NET 3.5 на IIS6, которое генерирует 401 «несанкционированных» ответов, за которыми следуют 200 «хорошо» ответов (по профилю Fiddler). Я знаю, почему это происходит (встроенная аутентификация, заставляющая браузер повторно отправлять учетные данные), но я ищу некоторые мысли о том, как минимизировать или искоренить ситуацию. Рассматриваемое приложение работает в глобальной сети, и некоторые пользователи испытывают задержку до 250 мс, поэтому форсирование последующего запроса может оказать заметное влияние на время загрузки страницы, особенно когда на страницах создается несколько каскадных выпадающих списков.

Пользователи приложения являются внутренними в среде управляемого рабочего стола, поэтому механизмы, заставляющие браузер отправлять учетные данные по первому запросу (возможно ли это?), Возможны с точки зрения развертывания. Это будет работать для страниц, требующих удостоверения пользователя, но для ресурсов, не требующих аутентификации (WebResource.axd, ScriptResource.axd и некоторых пользовательских веб-служб), что позволит анонимную аутентификацию. Я смотрел на определение этого для каждого местоположения в web.config, но результаты были неоднозначными (по-прежнему 401 ответ).

Буду признателен за любые рекомендации относительно «наилучшей практики» для решения этой ситуации. Существует множество ресурсов для определения проблемы, но я не нашел ни одного, который мог бы найти реальное решение.

Спасибо!

Редактировать: Ресурсы, не требующие аутентификации (например, веб-сервисы, используемые для каскадных выпадающих списков), можно запрашивать анонимно, добавив запись о местоположении в веб-конфигурацию, но я еще не нашел ответ для аутентифицированных ресурсов.

Ответы [ 4 ]

16 голосов
/ 30 апреля 2009

К сожалению, это артефакт схемы HTTP NTLM аутентификации .

Короче говоря, браузер (Internet Explorer или другой) не знает, что ему вообще нужно аутентифицироваться, пока он не получит ответ 401, содержащий WWW-Authenticate заголовок ответа.

В случае WWW-Authenticate: NTLM - достаточно досадно - для завершения требуется два 401 ответа на одно постоянное соединение, и этот процесс необходимо повторить после закрытия постоянного соединения HTTP. Таким образом, даже если вы смогли заставить браузер слепо инициировать запрос NTLM, по крайней мере один ответ 401 не может быть удален из транзакции.

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

3 голосов
/ 18 августа 2010

CSCRIPT.EXE c: \ inetpub \ adminscripts \ ADSUTIL.VBS SET W3SVC / AuthPersistSingleRequest FALSE

Значительно уменьшит количество 401.

0 голосов
/ 01 мая 2009

Вам может потребоваться рассмотреть проверку подлинности с помощью форм, если задержка, вызванная 401, слишком велика. Пользователи должны были войти в систему явно, но только один раз. Затем вы можете использовать схему cookie или схему без cookie и получить ответ с первой попытки.

Я полагаю, что загрузка страницы будет медленной, если у вас есть каскадные выпадающие списки, и ваша начальная загрузка страницы заполняет одно значение, которое заставляет POST получить следующий список, установить это значение, другое POST, чтобы снова получить следующий список, и скоро. Если это так, возможно, вам нужно заполнить все эти раскрывающиеся списки в первом цикле, а не ждать ответов POST.

0 голосов
/ 29 марта 2009

Я полагаю, что вы можете убедить Firefox автоматически отправлять учетные данные NTLM в набор доменов из белого списка с помощью параметров about: config - используйте параметр network.automatic-ntlm-auth.trusted-uris. Я не пробовал это сам, хотя. Я не уверен, что есть какой-либо эквивалент для Internet Explorer.

К сожалению, если вы используете что-то еще, например, Kerberos, похоже, нет способа избежать 401.

...