Table of Contents

Под каким пользователем выполняется Web-приложение?

Основные понятия

Процесс (process) - это объект, который создается операционной системой, когда пользователь запускает приложение. Процессу выделяется отдельное адресное пространство, причем это пространство физически недоступно для других процессов. Процесс запускается от имени определенного пользователя. Список запущенных процессов можно посмотреть в Task Manager.

Для каждого процесса операционная система создает один главный поток (thread), который является потоком выполняющихся команд. При необходимости главный поток может создавать другие потоки, пользуясь для этого программным интерфейсом ОС.

Олицетворение (impersonation) - механизм, позволяющий назначить текущему потоку реквизиты некоторого пользователя, что позволяет выполнять код от его имени. Данный механизм часто используется в web-приложениях, когда один и тот же поток обслуживает запросы от различных пользователей.

Модель IIS 6+

Application Pool

В модели IIS 6+ процессом, в котором выполняются веб-приложения является один из Application Pool (в Task Manager - w3wp.exe). Каждый Application Pool представляет собой пул потоков, который в общих чертах работает так:

Application Pool (как и любой процесс) запускается от имени определенного пользователя. Посмотреть/настроить можно

В IIS 6 пользователь по умолчанию – Network Service. В IIS 7+ в качестве пользователя по умолчанию (если иное не определено в Application Pool Defaults) выступает специальное понятие ApplicationPoolIdentity, которое означает, что для каждого пула с такой настройкой будет создан специальный пользователь в группе IIS AppPool, имя которого cовпадает с названием пула.

Олицетворение

Аутентификация IIS

Настраивается на уровне сайта(приложения) IIS

Анонимная аутентификация имеет приоритет над Windows-аутентификацией, если включены обе.

Анонимная аутентификация

Фактически аутентификации пользователя не происходит, а все запросы выполняются от имени специального пользователя. В случае включенного механизма олицетворения, от его имени и будет запущено веб-приложение.

Имя пользователя по умолчанию:

Анонимный пользователь может быть изменен:

Аутентификация Windows

Если пользователь находится внутри домена и использует бразуер, поддерживающий протокол аутентификации Kerberos (IE), то он будет автоматически аутентифицирован под своей учетной записью. В противном случае Windows попросит ввести логин и пароль. В любом случае при успешном прохождении Windows-аутентификации и включенном механизме олицетворения, веб-приложение будет запущено от имени аутентифицированного пользователя.

Группа IIS_IUSRS

В IIS 7.0 появилась группа IIS_IUSRS, в которую автоматически включаются все пользователи, под которыми запущены Application Pools. Пользователь IUSR в эту группу не входит!

О веб-приложениях

Веб-приложение в отличие от Windows-приложения является виртуальным. В рамках одного процесса может работать много веб-приложений. Когда мы говорим от том, под каким пользователем работает веб-приложение, фактически мы рассматриваем следующие вещи:

  1. Под каким пользователем работает Application Pool?
  2. Включен ли механизм олицетворения?
  3. Если включен, то какие настройки аутентификации приложения в IIS?

Когда все настройки по умолчанию

Отличия модели IIS 5

IIS 5 входит в состав Windows XP и Windows Server 2003.

В отличие от IIS 6 ASP.NET-приложения всегда выполняются в отдельном процессе (aspnet_wp.exe), который запускается от имени пользователя ASPNET. Соответственно ASP.NET-приложения могут работать либо под ним, либо под аутентифицированным пользователем IIS в случае включенного механизма олицетворения.

ASP-приложения в зависимости от настройки Имя сайта(приложения) → Properties → Home Directory → Application Protection могут запускаться в одном из 3 режимов:

В ASP-приложениях, запущенных на IIS 5 (так же как и на IIS 6) всегда работает олицетворение, так что они работают под аутентифицированным пользователем IIS.

Порождение дочерних процессов

Следует иметь в виду, что если порождается дочерний процесс, например с помощью System.Diagnostics.Process.Start, то он не учитывает олицетворение и по умолчанию запускается от имени пользователя, под которым запущен родительский процесс.