Устранение неполадок с проверкой подлинности Windows (без проблем) в IIS 7.5?

21

Я знаю, что есть тысячи сообщений о людях, испытывающих затруднения при использовании встроенной аутентификации Windows для работы с IIS, но все они, похоже, приводят к веб-страницам, которые не применяются, или решениям, которые я уже пробовал. Ранее я развернул десятки таких сайтов, поэтому либо с сервером / конфигурацией происходит что-то странное, либо я слишком долго смотрел на это и не видел очевидного.

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

На локальной машине:

  • Машина работает под управлением Windows 7 Ultimate, Service Pack 1, IIS 7.5.
  • Сайт был успешно протестирован с использованием IIS и сервера веб-разработки VS.
  • В конфигурации сайта IIS отключены все методы проверки подлинности, кроме проверки подлинности Windows.
  • Локальная машина не находится ни в одном домене.
  • Поставщики настроены: согласование и NTLM (не согласование: Kerberos).
  • Расширенная защита отключена.
  • Все протестированные браузеры (IE, Firefox, Chrome) показывают запрос вызова и позволяют мне входить в домен localhost с моей (локальной) учетной записью Windows.
  • Все протестированные браузеры также работают с использованием непрозрачного локального IP-адреса, поэтому сами браузеры, похоже, не заботятся о том, является ли сайт «локальным» или «удаленным».
  • Я добавил строку отображения на веб-страницу, которая показывает пользователя, вошедшего в систему в данный момент, и показывает, что именно я ожидал (с каким локальным пользователем я вошел в систему).

На удаленной машине:

  • Сервер работает под управлением Windows Server 2008 R2, IIS 7.5.
  • Загрузка веб-страницы приводит к немедленной ошибке 401.2: вы не авторизованы для просмотра этой страницы из-за неверных заголовков аутентификации. Никакой подсказки никогда не появляется.
  • В конфигурации сайта IIS отключены все методы проверки подлинности, кроме проверки подлинности Windows.
  • Удаленная машина не находится ни в одном домене.
  • Поставщики настроены: согласование и NTLM (не согласование: Kerberos).
  • Расширенная защита отключена.
  • На удаленном компьютере (сеанс удаленного рабочего стола) такая же ошибка появляется в Internet Explorer независимо от того, является ли домен локальным или внешним IP-адресом.
  • Если я пытаюсь просмотреть удаленный веб-сайт с моего локального компьютера, ошибка все равно 401, но немного отличается от 401. Никакого субкода с текстом: Доступ запрещен из-за неверных учетных данных.
  • Проверка подлинности Windows функция роли IIS будет установлена.
  • WindowsAuthentication модуль будет добавлен (на уровне сервера).
  • Точно такая же ошибка возникает, если я отключаю проверку подлинности Windows и включаю обычную проверку подлинности.
  • Сайт действительно загружается, если я отключаю аутентификацию Windows и включаю анонимный доступ (очевидно).
  • Я уже выполнил все шаги по устранению неполадок поддержки Microsoft: Устранение ошибок HTTP 401 в IIS
  • Я уже попробовал обходной путь, показанный на другой странице поддержки Microsoft (предположительно, чтобы заставить NTLM использовать как единственный метод).

И последнее, но не менее важное: я попытался включить FREB для ошибок 401.2, и результаты, похоже, не говорят мне ничего полезного, все, что я вижу, это следующее предупреждение:

MODULE_SET_RESPONSE_ERROR_STATUS

ModuleName IIS Web Core
Уведомление 2
HttpStatus 401
HttpReason Несанкционированный
HttpSubStatus 2
ErrorCode 2147942405
ConfigExceptionInfo
Уведомление AUTHENTICATE_REQUEST
ErrorCode Доступ запрещен. (0x80070005)

... это, кажется, просто говорит мне то, что я уже знаю (это просто отклоняет запрос вместо согласования учетных данных).

Трассировка действительно указывает на то, что модуль WindowsAuthentication правильно загружен, потому что есть NOTIFY_MODULE_STARTстрока с ModuleName= WindowsAuthentication(и различными другими последующими событиями ASP.NET - к счастью, здесь нет интересных ошибок или предупреждений).

Может кто-нибудь сказать мне, что я мог бы упустить здесь?


Быстрое обновление:

Мне немного неудобно отправлять весь дамп Wireshark, так как он показывает IP-адреса, URL-адреса и другие вещи, но я провел параллельное сравнение HTTP-ответов от localhost и удаленного сервера в Fiddler, и это кажется довольно самостоятельным -видно в чем проблема:

Localhost:

HTTP / 1.1 401 Несанкционированный
Cache-Control: приватный
Content-Type: text / html; кодировка = UTF-8
Сервер: Microsoft-IIS / 7.5
WWW-Аутентификация: переговоры
WWW-Аутентификация: NTLM
X-Powered-By: ASP.NET
Дата: сб, 17 дек 2011 23:42:34 GMT
Контент-длина: 6399
Proxy-Support: Session-Based-Authentication

Удаленный:

HTTP / 1.1 401 Несанкционированный
Тип контента: текст / HTML
Сервер: Microsoft-IIS / 7.5
X-Powered-By: ASP.NET
Дата: сб, 17 дек 2011 23:43:13 GMT
Длина контента: 1293

Помимо нескольких, казалось бы, несущественных различий, таких как управление кэшем, основное отличие состоит в том, что удаленный сервер не отправляет заголовки WWW-Authenticate обратно клиенту.

Итак, я предполагаю, что это сужает вопрос до: Почему IIS не отправляет заголовки WWW-Authenticate, когда аутентификация Windows установлена, загружена и включена исключительно?

Aaronaught
источник
Не возьмете ли вы захват открытого текстового сообщения о попытке аутентификации (сначала измените пароль на что-то одноразовое - мы не хотим, чтобы ваши реальные пароли хэшились в сети)? Примерно 18 месяцев назад исправление Windows внесло некоторые изменения в согласование HTTP NTLM (кстати, все ли системы исправлены?), Которые взорвали приложение поставщика и дали мне больше опыта, чем я могу себе позволить, анализируя переговорные разговоры.
Шейн Мэдден
@ShaneMadden: Я как бы возражаю из-за всей разной информации, которую я буду раскрывать, но я могу провести сеанс Fiddler, который должен быть почти таким же, а затем я могу, по крайней мере, анонимизировать IP-адреса и так далее - и На самом деле, я уже сделал, результаты должны быть довольно очевидными (клиент не показывает запрос учетных данных, потому что сервер не запрашивает их).
Aaronaught
О, интересно, кто-то, кажется, также сообщал об этой проблеме в переполнении стека - к сожалению, там нет ответов.
Aaronaught
@Aaronaught Как вы получили другое имя пользователя, чем на Cooking? Когда я впервые увидел этот вопрос, я подумал, что это кто-то подделывает вас.
Опека - Восстановите Монику
@Ward: любой может редактировать свое имя пользователя, это часть профиля. Это был мой оригинальный, используйте другие только на нетехнических сайтах.
Aaronaught

Ответы:

14

Проблема решена. Я наконец решил сравнить список модулей бок о бок, и на самом деле одного из них не было. Оказывается, есть два модуля аутентификации Windows:

Список модулей

На сервере был управляемый WindowsAuthenticationмодуль, но не WindowsAuthenticationModuleвыделенный выше. Почему он был настроен таким образом, можно только догадываться, но, очевидно, если родной модуль не загружен, управляемый модуль будет загружаться и молча давать сбой.

Поэтому для любых будущих читателей, которые столкнутся с этой проблемой, убедитесь, что у вас загружены оба модуля , потому что IIS не предупредит вас, если один из них отсутствует.

Aaronaught
источник
Управляемый модуль WindowsAuthentication - это не то, на что он похож. Он поддерживает удостоверения Windows в ASP.Net и всегда устанавливается (когда установлен ASP.Net). Но встроенный модуль проверки подлинности Windows - это то, что устанавливается, когда вы выбираете компонент проверки подлинности Windows в Диспетчере серверов, и это то, что вам нужно, чтобы этот параметр проверки подлинности стал видимым в графическом интерфейсе проверки подлинности.
TristanK
@TristanK: В этом случае этот компонент был отмечен, но модуль не был установлен. (Однако этот параметр был виден в графическом интерфейсе аутентификации, поэтому я вполне уверен, что экран зависит от управляемого модуля, а не от собственного.)
Aaronaught
Я думаю, что это могло произойти из-за некоторого вмешательства в файлы конфигурации (возможно, ApplicationHost.config). Но я думаю, это не имеет значения, как все вышло из строя; это сделал.
Aaronaught
Ну понятно. Проверка подлинности Windows не работает, если что-то не сломает ее; в этом случае, хотя вопрос гласит, что конфигурация идентична, это оказывается неверным; так что это не сработало. QED.
TristanK
1
Эта проблема с отсутствующим модулем укусила меня в Windows Server 2012 R2. Невероятно, что нет никаких признаков, когда это состояние возникает. В любом случае, большое спасибо за этот ответ; Я буквально рвал на себе волосы!
Роб Дэвис
4

Мы обнаружили, что это не обязательно решает проблему для разработчиков, работающих локально на сайтах ASP.NET, работающих под аутентификацией Windows. Мы нашли взлом реестра, который отключает проверку петли; это исправило это: -

раздел реестра - HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa

Создайте DWORD со значением 1 с именем «DisableLoopbackCheck»

Вам нужно будет перезагрузить машину, чтобы настройки вступили в силу

sh1rts
источник
Я обнаружил, что могу переключаться между DisableLoopbackCheck, равным 1 и 0, и изменение вступит в силу немедленно. Кроме того, вы можете увидеть событие с кодом 4625 в журнале событий журнала безопасности с сообщением «Не удалось войти в учетную запись».
alastairtree
Спасибо! 2 дня работы с аутентификацией IIS и версиями .Net только для того, чтобы найти это, потому что я использовал свой файл hosts для создания фиктивной записи DNS во время тестирования миграции сайта.
JohnLBevan