Имитация и возврат

Замечание

Эта статья относится к Windows.

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

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

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

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

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

См. также