Олицетворение и возвращение
Обновлен: Ноябрь 2007
Иногда пользователю может потребоваться получить лексему учетной записи Windows NT для олицетворения учетной записи Windows. Например, приложению ASP.NET может понадобиться действовать от лица нескольких пользователей в различное время. Приложение может принять лексему, представляющую собой администратора из служб IIS, олицетворить этого пользователя, выполнить операцию и вернуться к предыдущему удостоверению. Затем оно может принять лексему из служб IIS, которая представляет пользователя с меньшим набором прав, выполнить какую-либо операцию и снова вернуться.
В ситуации, когда приложение должно олицетворить учетную запись Windows, которая не была присоединена службами IIS к текущему потоку, следует получить лексему учетной записи и использовать ее для активации учетной записи. Чтобы это сделать, следует выполнить следующие действия.
Необходимо извлечь лексему учетной записи для конкретного пользователя, вызвав неуправляемый метод LogonUser. Этот метод находится не в библиотеке базовых классов .NET Framework, а в неуправляемой библиотеке advapi32.dll. Обращение к неуправляемым программным кодам является дополнительной операцией и выходит за рамки данного раздела. Дополнительные сведения см. в разделе Взаимодействие с неуправляемым кодом. Дополнительные сведения о методе LogonUser и библиотеке advapi32.dll см. в документации Platform SDK.
Создайте новый экземпляр класса WindowsIdentity, передав лексему. В следующем примере кода демонстрируется этот вызов, где hToken представляет собой лексему Windows.
WindowsIdentity ImpersonatedIdentity = new WindowsIdentity(hToken);
Dim ImpersonatedIdentity As New WindowsIdentity(hToken)
Начните олицетворение, создав новый экземпляр класса WindowsImpersonationContext и инициализировав его с помощью метода WindowsIdentity.Impersonate инициализированного класса, как показано в следующем программном коде.
WindowsImpersonationContext MyImpersonation = ImpersonatedIdentity.Impersonate();
WindowsImpersonationContext MyImpersonation = ImpersonatedIdentity.Impersonate()
Когда олицетворение больше не требуется, вызовите метод WindowsImpersonationContext.Undo для возврата, как показано в следующем программном коде.
MyImpersonation.Undo();
MyImpersonation.Undo()
Если доверенный код уже присоединил объект WindowsPrincipal к потоку, можно вызвать метод Impersonate экземпляра, который не требует лексемы учетной записи. Обратите внимание, что этот способ применяется только тогда, когда объект WindowsPrincipal потока представляет пользователя, отличного от того, от имени которого выполняется процесс. Это может случиться, например, при использовании ASP.NET с включенной проверкой подлинности Windows и отключенным олицетворением. В этом случае процесс выполняется под учетной записью, сформированной в службах IIS, тогда как текущий участник представляет пользователя Windows, получившего доступ к странице.
Обратите внимание, что ни метод Impersonate, ни метод Undo не изменяют объект Principal, связанный с текущим контекстом вызова. Точнее, олицетворение и возврат меняют лексему, связанную с текущим процессом операционной системы.
См. также
Основные понятия
Использование проверки подлинности IIS с олицетворением ASP.NET