Приложение IIS, использующее удостоверение пула приложений, теряет основной токен? - PullRequest
59 голосов
/ 13 марта 2012

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

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

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

Это веб-приложение выполняется под виртуальным «идентификатором пула приложений», для которого для параметра «Идентификация пула приложений» установлено значение ApplicationPoolIdentity . Краткое описание виртуальных удостоверений можно найти в ответе StackOverflow и посте в блоге, на который он ссылается: удостоверение пула приложений - это просто дополнительная группа, которая добавляется к рабочим процессам веб-приложения, которое выполняется как «сетевой сервис». Однако один источник смутно говорит о том, что «сетевая служба и ApplicationPoolIdentity действительно имеют различия, которые не публикуются документами сайта IIS.net». Таким образом, виртуальная личность может быть больше, чем просто дополнительная группа.

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

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

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

Это приложение также подключается к базе данных 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, он снова работает. (Обратите внимание, что доступ к AD необходим для Kerberos, но не для 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? При каких обстоятельствах происходит первичная потеря токена?

Ответы [ 3 ]

35 голосов
/ 21 марта 2012

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

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

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

2 голосов
/ 29 июня 2012

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

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

0 голосов
/ 03 июня 2016

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

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

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

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

...