Олицетворение и отмена изменений
Примечание.
Эта статья применима к Windows.
Сведения о ASP.NET Core см. в разделе ASP.NET Core Security.
Иногда может потребоваться получить токен учетной записи Windows для олицетворения учетной записи Windows. Например, приложению ASP.NET может требоваться действовать от лица разных пользователей в разное время. Ваше приложение может принять токен, представляющий администратора, из служб IIS, выполнить олицетворение этого пользователя, выполнить операцию и вернуться к предыдущему удостоверению. Далее он может принять токен из служб IIS, который представляет пользователя с меньшим набором прав, выполнить некую операцию и снова вернуться.
В ситуациях, когда приложение должно олицетворять учетную запись Windows, не подключенную к текущему потоку службами IIS, необходимо получить токен для этой учетной записи и с его помощью активировать эту учетную запись. Это можно сделать, выполнив следующие задачи.
Получите токен учетной записи для конкретного пользователя путем вызова неуправляемого метода LogonUser. Этот метод не находится в библиотеке базовых классов .NET, но находится в неуправляемом 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 код уже подключил объект к потоку, можно вызвать олицетворенный метод экземпляра, который не принимает маркер учетной записи. Обратите внимание, что это целесообразно только в том случае, если объект WindowsPrincipal в потоке представляет пользователя, отличного от того, под которым выполняется процесс. Например, такая ситуация может возникнуть при использовании ASP.NET с включенной проверкой подлинности Windows и отключенным олицетворением. В этом случае процесс выполняется под учетной записью, настроенной в IIS, тогда как текущий участник представляет пользователя Windows, который обращается к странице.
Обратите внимание, что ни олицетворение, ни отмена изменения объекта Principal (IPrincipal), связанного с текущим контекстом вызова. Скорее, олицетворение и отменить изменения изменение маркера, связанного с текущим процессом операционной системы.