Я знаю, что есть тысячи отчетов о людях, у которых проблемы с установкой интегрированной проверки подлинности Windows для работы с IIS, но все они, похоже, приводят к неприменимым веб-страницам или решениям, которые я уже пробовал. Я уже развернул десятки подобных сайтов, так что либо с сервером / конфигурацией происходит что-то странное, либо я слишком долго смотрел на это и не видел очевидного.
Проще говоря, все работает отлично на моем локальном компьютере, но разваливается на рабочем сервере, который, насколько я могу судить, имеет точно такая же конфигурация.
На локальной машине:
На удаленной машине:
И последнее, но не менее важное: я попытался включить FREB для ошибок 401.2, и результаты, похоже, не говорят мне ничего полезного, все, что я вижу, это следующее предупреждение:
MODULE_SET_RESPONSE_ERROR_STATUS
ModuleName IIS Web Core
Уведомление 2
HttpStatus 401
HttpReason неавторизован
HttpSubStatus 2
Код ошибки 2147942405
ConfigExceptionInfo
Уведомление AUTHENTICATE_REQUEST
ErrorCode Доступ запрещен. (0x80070005)
... похоже, это просто говорит мне то, что я уже знаю (что он просто отклоняет запрос вместо согласования учетных данных).
Трассировка действительно указывает, что модуль WindowsAuthentication загружен правильно, потому что существует NOTIFY_MODULE_START
линия с ModuleName
знак равно WindowsAuthentication
(и различные другие последующие события ASP.NET - [не] к счастью, здесь нет никаких интересных ошибок или предупреждений).
Может ли кто-нибудь сказать мне, чего мне здесь не хватает?
Быстрое обновление:
Мне немного неудобно отправлять весь дамп Wireshark, поскольку он раскрывает IP-адреса, URL-адреса и другие вещи, но я провел параллельное сравнение HTTP-ответов от localhost и удаленного сервера в Fiddler, и это кажется довольно самодостаточным -видно, в чем проблема:
Локальный хост:
HTTP/1.1 401 Unauthorized Cache-Control: private Content-Type: text/html; charset=utf-8 Server: Microsoft-IIS/7.5 WWW-Authenticate: Negotiate WWW-Authenticate: NTLM X-Powered-By: ASP.NET Date: Sat, 17 Dec 2011 23:42:34 GMT Content-Length: 6399 Proxy-Support: Session-Based-Authentication
Удаленный:
HTTP/1.1 401 Unauthorized Content-Type: text/html Server: Microsoft-IIS/7.5 X-Powered-By: ASP.NET Date: Sat, 17 Dec 2011 23:43:13 GMT Content-Length: 1293
Помимо нескольких, казалось бы, несущественных отличий, таких как управление кешем, основное отличие состоит в том, что удаленный сервер не отправляет клиенту заголовки WWW-Authenticate.
Итак, я полагаю, это сужает вопрос до: Почему IIS не отправляет заголовки WWW-Authenticate, если проверка подлинности Windows установлена, загружена и включена исключительно?
Задача решена. Я наконец решил сравнить модуль список рядом, и на самом деле не хватало одного. Оказывается, есть два Модули аутентификации Windows:
На сервере управляемый WindowsAuthentication
модуль был, но не родной WindowsAuthenticationModule
выделено выше. Остается только догадываться, почему он был настроен таким образом, но очевидно, что если собственный модуль не загружен, управляемый модуль будет радостно загружаться и молча выйдет из строя.
Поэтому для будущих читателей, которые столкнутся с этой проблемой, убедитесь, что у вас есть оба модуля загружены, потому что IIS не буду предупреждать вас если один из них отсутствует.
Мы обнаружили, что это не обязательно решает проблему для разработчиков, работающих локально на сайтах ASP.NET, работающих с проверкой подлинности Windows. Мы нашли способ взлома реестра, который отключает проверку обратной связи; это исправило это: -
ключ реестра - HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa
Создайте DWORD со значением 1 под названием DisableLoopbackCheck.
Вам придется перезагрузить компьютер, чтобы настройки вступили в силу.