Интегрированная проблема аутентификации IE / IIS - PullRequest
5 голосов
/ 10 октября 2009

В IIS у меня есть:

http://myserver/myapplication
http://myserver/reports

Приложение отчетов на самом деле использует службы отчетов, использующие проверку подлинности Windows. myapplication - это приложение asp.net, которое использует проверку подлинности на основе форм.

Сервер находится за пределами домена компании. Если я сначала получаю доступ к отчетам и при появлении запроса ввожу имя пользователя и пароль (локальные учетные данные, созданные на сервере), я могу получить доступ к странице отчетов, никаких проблем. Если затем я сразу перехожу на страницу входа в свое приложение и пытаюсь войти, страница входа обновляется, ничего не делая. Это всегда происходит в IE 6. В IE 7 это происходит периодически. Этого не происходит в Firefox или если Fiddler работает в фоновом режиме, что, похоже, решает проблему на лету.

Я использовал wireshark, чтобы посмотреть, что происходит, и обнаружил, что IE 6 отправляет маркер аутентификации Windows, полученный из приложения отчетов, в myapp. Это была единственная разница между IE и Firefox. IIS, кажется, взбесился и просто интерпретирует мой POST на странице входа в систему как GET и возвращает.

Если я добавляю проверку подлинности Windows к моему приложению в IIS, все работает нормально с любым браузером.

Почему это происходит? Ошибка в IE или я что-то упустил?

1 Ответ

13 голосов
/ 10 октября 2009

Это ошибка как в IE, так и ошибка в дизайне аутентификации NTLM / Negotiate (он же интегрированный) по HTTP.

NTLM / Negotiate - это протоколы аутентификации, ориентированные на соединение, для которых HTTP не был предназначен. В результате, когда вам требуется этот механизм аутентификации для одной страницы на вашем сервере, IE обычно предполагает, что другие страницы на сервере имеют такое же требование.

Кроме того, по соображениям производительности и безопасности, если IE ожидает вызов Negotiate / NTLM для данного запроса POST, он сначала отправит 0-байтовый POST, ожидая, что сервер вернет HTTP / 401 вызов, к которому он будет проходить проверку подлинности, а затем правильно отправить тело POST.

Однако, в вашем случае, папка, которая не требует встроенной аутентификации, получает 0-байтовый POST и говорит: «Хм, странно, 0-байтовая запись. Хорошо, HTTP / 200, вот эта страница, как если бы вы использовали GET. "

Поскольку IE никогда не получает ожидаемый вызов 401, он фактически никогда не отправляет тело POST.

(Fiddler может вас немного смущать из-за того, как работает повторное использование HTTP-соединения).

Обходной путь должен гарантировать, что если вы используете встроенную аутентификацию на хосте, используйте его везде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...