Приложение IIS с использованием идентификатора пула приложений теряет основной токен?

(Это вопрос о неопределенной проблеме. Я пытаюсь представить все релевантные данные в надежде, что у кого-то есть полезная информация, извинения за длинное описание.)

Наше веб-приложение

У нас есть веб-приложение .NET 4, работающее в IIS 7.5, доступ к Active Directory и базе данных SQL Server.

Это веб-приложение работает под виртуальным "идентификатором пула приложений", установив для Identity пула приложений приложение ApplicationPoolIdentity. Краткое описание виртуальных идентификаторов можно найти в qaru.site/info/19841/... и в сообщении блога, на которое оно ссылается: идентификатор пула приложений - это дополнительная группа, которая добавляется к рабочие процессы веб-приложения, работающие как "сетевые службы". Тем не менее, один источник смутно предлагает, что "Network Service и ApplicationPoolIdentity имеют различия в том, что документы сайта IIS.net не публикуются". Таким образом, виртуальная идентификация может быть не просто дополнительной группой.

Мы решили использовать ApplicationPoolIdentity, в отличие от NetworkService, поскольку он стал стандартным для IIS 7.5 (см., например, здесь) и по рекомендации Microsoft: "Это удостоверение позволяет администраторам указывать разрешения, относящиеся только к идентификатору, в котором работает пул приложений, тем самым повышая безопасность сервера". (из processModel Element для добавления для applicationPools [Схема настроек IIS 7]) "Идентификаторы пула приложений - это мощная новая функция изоляции", которая "работает" Приложения IIS еще более безопасны и надежны ". (Из Статья IIS.net" Идентификаторы пула приложений")

Приложение использует встроенную проверку подлинности Windows, но с <identity impersonate="false"/>, так что не идентичность конечного пользователя, а идентификатор пула виртуальных приложений используется для запуска нашего кода.

Это приложение запрашивает Active Directory, используя классы System.DirectoryServices, то есть API ADSI. В большинстве случаев это делается без указания дополнительного имени пользователя/пароля или других учетных данных.

Это приложение также подключается к базе данных SQL Server с помощью Integrated Security=true в строке подключения. Если база данных является локальной, мы видим, что IIS APPPOOL\OurAppPoolName используется для подключения к базе данных; если база данных удаленная, то используется учетная запись машины OURDOMAIN\ourwebserver$.

Наши проблемы

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

  • Когда база данных находится в удаленной системе, соединение с базой данных начинает сбой: "Ошибка входа для пользователя" NT AUTHORITY\ANONYMOUS LOGON ". Причина: проверка доступа к серверу на основе токена завершилась неудачей с ошибкой инфраструктуры. Проверьте предыдущие ошибки." Предыдущая ошибка: "Ошибка: 18456, серьезность: 14, состояние: 11." Похоже, теперь OURDOMAIN\ourwebserver$ больше не используется, но вместо этого выполняется попытка анонимного доступа. (У нас есть неопровержимые доказательства того, что эта проблема возникла, когда UAC был отключен, и что он ушел после включения UAC. Но обратите внимание, что изменение UAC требует перезагрузки...) Аналогичная проблема возникает в поток IIS.net "использует ApplicationPoolIdentity для подключения к SQL" , в частности, один ответ.

  • Операции Active Directory через ADSI (System.DirectoryServices) начинают сбой с ошибкой 0x8000500C ( "Неизвестная ошибка" ), 0x80072020 ( "Произошла операционная ошибка" ) или 0x200B ( "Указанный атрибут службы каталогов или значение не существует" ).

  • Вход в приложение из Internet Explorer начинает работать с ошибкой HTTP 401. Но если в IIS мы помещаем NTLM до Negotiate, тогда он работает снова. (Обратите внимание, что для Kerberos необходим доступ к AD, но не для NTLM.) Аналогичная проблема приведена в поток IIS.net "Аутентификация окна, не выполняющая идентификатор AppPool" .

Наша гипотеза и обход

По крайней мере, проблемы AD и входа всегда исчезают при переключении пула приложений из ApplicationPoolIdentity в NetworkService. (Мы обнаружили один отчет, подтверждающий это.)

Страница "Устранение проблем аутентификации на страницах ASP" содержит некоторые предложения, касающиеся первичных или вторичных токенов, и то, что я считаю обнадеживающим, заключается в том, что он связывает первые две наши ошибки: он упоминает NT AUTHORITY\ANONYMOUS LOGON доступ и ошибки AD 0x8000500C и "Указанный атрибут или значение службы каталогов не существует".

(На той же странице также упоминаются проблемы кэша схемы ADSI, но все, что мы можем найти в этой теме, устарело. Пока мы считаем, что это не связано.)

Исходя из вышесказанного, наша текущая рабочая гипотеза заключается в том, что только при запуске под идентификатором виртуального приложения, наше веб-приложение (рабочий процесс IIS?) внезапно теряет свой основной токен, так что IIS имеет только вторичный токен, так что весь доступ к Active Directory и SQL Server выполняется анонимно, что приводит ко всем вышеперечисленным ошибкам.

Теперь мы намерены перейти от ApplicationPoolIdentity к NetworkService. Надеюсь, это уберет все вышеуказанные проблемы. Но мы не уверены; и мы хотели бы вернуться, если это возможно.

Наш вопрос

Является ли приведенная выше гипотеза правильной, и если да, это ошибка в IIS/Windows/.NET? При каких обстоятельствах происходит эта первичная потеря токенов?

Ответ 1

Через службу поддержки Microsoft я узнал, что мы столкнулись с проблемой, описанной в статье базы знаний Майкрософт KB2545850. Это происходит только при использовании ApplicationPoolIdentity. Это происходит очень легко, а именно после изменения пароля учетной записи компьютера (который по умолчанию происходит автоматически каждые 30 дней), а затем IIS перезапускается (например, через iisreset). Обратите внимание, что проблема исчезнет после перезагрузки, согласно Microsoft и нашим наблюдениям.

В соответствии с Microsoft невозможно проверить, попало ли ваше Windows/IIS в это состояние.

У Microsoft есть исправление, прилагаемое к этой статье в КБ. Нет никаких указаний на то, что это исправление будет перенесено в официальную поставку, а исправление уже прошло 10 месяцев. В нашем конкретном случае мы решили переключиться на NetworkService.

Ответ 2

См. https://serverfault.com/a/403534/126432 для моих комментариев по той же самой проблеме/решению.

Использование исправления, с которым вы связались, позволило мне получить ApplicationPoolIdentity, работая, как говорят документы. Это исправление специально не описывает решение для доступа к сетевым ресурсам как NT AUTHORITY\ANONYMOUS LOGON, но оно связано с изменением пароля компьютера. Суть в том, что он работал у меня, по крайней мере, до сих пор.

Ответ 3

Это также актуально для Umbraco с использованием проверки подлинности Active Directory. Время от времени вы можете получить это исключение:

Ошибка конфигурации

Указанный атрибут или значение службы каталогов не существует

Это, по-видимому, вызвано проблемой, изложенной здесь. Перезагрузка неизменно исправляет ее.