Олицетворение и отмена изменений

Примечание.

Эта статья применима к Windows.

Сведения о ASP.NET Core см. в разделе ASP.NET Core Security.

Иногда может потребоваться получить токен учетной записи Windows для олицетворения учетной записи Windows. Например, приложению ASP.NET может требоваться действовать от лица разных пользователей в разное время. Ваше приложение может принять токен, представляющий администратора, из служб IIS, выполнить олицетворение этого пользователя, выполнить операцию и вернуться к предыдущему удостоверению. Далее он может принять токен из служб IIS, который представляет пользователя с меньшим набором прав, выполнить некую операцию и снова вернуться.

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

  1. Получите токен учетной записи для конкретного пользователя путем вызова неуправляемого метода LogonUser. Этот метод не находится в библиотеке базовых классов .NET, но находится в неуправляемом advapi32.dll. Доступ к методам в неуправляемом коде является сложной операцией и выходит за рамки данного обсуждения. Дополнительные сведения см. в разделе Взаимодействие с неуправляемым кодом. Дополнительные сведения о методе LogonUser и библиотеке advapi32.dll см. в документации Platform SDK.

  2. Создайте новый экземпляр класса WindowsIdentity, передав токен. Следующий код демонстрирует этот вызов, где hToken представляет токен Windows.

    WindowsIdentity impersonatedIdentity = new WindowsIdentity(hToken);  
    
    Dim impersonatedIdentity As New WindowsIdentity(hToken)  
    
  3. Начните олицетворение, создав новый экземпляр класса WindowsImpersonationContext и инициализировав его с помощью метода WindowsIdentity.Impersonate инициализации класса, как показано в следующем коде.

    WindowsImpersonationContext myImpersonation = impersonatedIdentity.Impersonate();  
    
    WindowsImpersonationContext myImpersonation = impersonatedIdentity.Impersonate()  
    
  4. Если это олицетворение больше не требуется, вызовите метод WindowsImpersonationContext.Undo для отмены олицетворения, как показано в следующем коде.

    myImpersonation.Undo();  
    
    myImpersonation.Undo()  
    

Если доверенный WindowsPrincipal код уже подключил объект к потоку, можно вызвать олицетворенный метод экземпляра, который не принимает маркер учетной записи. Обратите внимание, что это целесообразно только в том случае, если объект WindowsPrincipal в потоке представляет пользователя, отличного от того, под которым выполняется процесс. Например, такая ситуация может возникнуть при использовании ASP.NET с включенной проверкой подлинности Windows и отключенным олицетворением. В этом случае процесс выполняется под учетной записью, настроенной в IIS, тогда как текущий участник представляет пользователя Windows, который обращается к странице.

Обратите внимание, что ни олицетворение, ни отмена изменения объекта Principal (IPrincipal), связанного с текущим контекстом вызова. Скорее, олицетворение и отменить изменения изменение маркера, связанного с текущим процессом операционной системы.

См. также