Compartir a través de


Suplantar y revertir

Nota:

Este artículo se aplica a Windows.

Para obtener información sobre ASP.NET Core, consulte ASP.NET Core Security.

A veces, es posible que tenga que obtener un token de cuenta de Windows para suplantar una cuenta de Windows. Por ejemplo, tu aplicación basada en ASP.NET podría tener que representar a varios usuarios en diferentes momentos. La aplicación puede aceptar un token que represente a un administrador de Internet Information Services (IIS), suplantar a ese usuario, realizar una operación y revertir a la identidad anterior. A continuación, podría aceptar un token de IIS que represente a un usuario con menos derechos, realizar alguna operación y revertir de nuevo.

En situaciones en las que la aplicación debe suplantar una cuenta de Windows que no se haya adjuntado al subproceso actual mediante IIS, debe recuperar el token de esa cuenta y usarlo para activar la cuenta. Para ello, realice las siguientes tareas:

  1. Recupere un token de cuenta para un usuario determinado realizando una llamada al método LogonUser no administrado. Este método no está en la biblioteca de clases base de .NET, pero se encuentra en el advapi32.dllno administrado. El acceso a métodos en código no administrado es una operación avanzada y está fuera del ámbito de esta discusión. Para más información, consulte Interoperating with Unmanaged Code (Interoperar con código no administrado) Para obtener más información sobre el método LogonUser y advapi32.dll, consulte la documentación del SDK de plataforma.

  2. Cree una nueva instancia de la clase WindowsIdentity y pase el token. El código siguiente muestra esta llamada, donde hToken representa un token de Windows.

    WindowsIdentity impersonatedIdentity = new WindowsIdentity(hToken);  
    
    Dim impersonatedIdentity As New WindowsIdentity(hToken)  
    
  3. Comience la suplantación creando una nueva instancia de la WindowsImpersonationContext clase e inicializándola con el WindowsIdentity.Impersonate método de la clase inicializada, como se muestra en el código siguiente.

    WindowsImpersonationContext myImpersonation = impersonatedIdentity.Impersonate();  
    
    WindowsImpersonationContext myImpersonation = impersonatedIdentity.Impersonate()  
    
  4. Cuando ya no necesite suplantar, llame al método WindowsImpersonationContext.Undo para revertir la suplantación, como se muestra en el código siguiente.

    myImpersonation.Undo();  
    
    myImpersonation.Undo()  
    

Si el código de confianza ya asoció un objeto WindowsPrincipal al subproceso, puede llamar al método de instancia Impersonate, que no toma un token de cuenta. Tenga en cuenta que esto solo es útil cuando el objeto WindowsPrincipal del subproceso representa a un usuario distinto del que está ejecutando el proceso actualmente. Por ejemplo, podría encontrarse con esta situación mediante ASP.NET con la autenticación de Windows activada y la suplantación desactivada. En este caso, el proceso se ejecuta en una cuenta configurada en Internet Information Services (IIS) mientras la entidad de seguridad actual representa al usuario de Windows que está accediendo a la página.

Tenga en cuenta que ni Impersonate ni Undo cambian el objeto Principal (IPrincipal) asociado al contexto de llamada actual. En su lugar, la suplantación y la reversión cambian el token asociado con el proceso del sistema operativo actual.

Consulte también