Representando e revertendo

Observação

Este artigo aplica-se ao Windows.

Para obter informações sobre o ASP.NET Core, confira Segurança do ASP.NET Core.

Às vezes pode ser necessário obter um token de conta do Windows para representar uma conta do Windows. Por exemplo, seu aplicativo baseado em ASP.NET pode precisar agir em nome de vários usuários em momentos diferentes. Seu aplicativo pode aceitar um token que representa um administrador dos IIS (Serviços de Informações da Internet), representar esse usuário, executar uma operação e reverter para a identidade anterior. Então pode aceitar um token do IIS que representa um usuário com menos direitos, executar alguma operação e reverter novamente.

Em situações em que seu aplicativo deve representar uma conta do Windows que não foi anexada ao thread atual pelo IIS, você deve recuperar o token dessa conta e usá-lo para ativar a conta. Você pode fazer isso executando as seguintes tarefas:

  1. Recupere um token de conta para um usuário específico fazendo uma chamada para o método LogonUser não gerenciado. Esse método não está na biblioteca de classes base do .NET, mas está localizado no advapi32.dllnão gerenciado . Acessar métodos em código não gerenciado é uma operação avançada e está além do escopo desta discussão. Para mais informações, confira Interoperar com código não gerenciado. Para mais informações sobre o método LogonUser e advapi32.dll, confira a documentação do SDK da Plataforma.

  2. Crie uma instância da classe WindowsIdentity passando o token. O código a seguir demonstra essa chamada, em que hToken representa um token do Windows.

    WindowsIdentity impersonatedIdentity = new WindowsIdentity(hToken);  
    
    Dim impersonatedIdentity As New WindowsIdentity(hToken)  
    
  3. Comece a representação criando uma instância da classe WindowsImpersonationContext e inicializando-a com o WindowsIdentity.Impersonate método da classe inicializada, conforme mostrado no código a seguir.

    WindowsImpersonationContext myImpersonation = impersonatedIdentity.Impersonate();  
    
    WindowsImpersonationContext myImpersonation = impersonatedIdentity.Impersonate()  
    
  4. Quando você não precisar mais representar, chame o método WindowsImpersonationContext.Undo para reverter a representação, conforme mostrado no código a seguir.

    myImpersonation.Undo();  
    
    myImpersonation.Undo()  
    

Se o código confiável já tiver anexado um objeto WindowsPrincipal ao thread, você poderá chamar o método de instância Impersonate, que não usa um token de conta. Observe que isso só é útil quando o objeto WindowsPrincipal no thread representa um usuário diferente daquele sob o qual o processo está sendo executado no momento. Por exemplo, você pode encontrar essa situação usando ASP.NET com autenticação do Windows ativada e a representação desativada. Nesse caso, o processo está em execução em uma conta configurada nos IIS (Serviços de Informações da Internet), enquanto a entidade de segurança atual representa o usuário do Windows que está acessando a página.

Observe que nem Representar nem Desfazer altera o objeto Principal (IPrincipal) associado ao contexto de chamada atual. Em vez disso, a representação e a reversão alteram o token associado ao processo atual do sistema operacional.

Confira também