Saltar al contenido

¿Cómo se hace la suplantación de identidad en .NET?

Te damos la bienvenida a proyecto online, ahora vas a hallar la solucíon a lo que necesitas.

Solución:

“Suplantación de identidad” en el espacio .NET generalmente significa ejecutar código bajo una cuenta de usuario específica. Es un concepto un tanto diferente al de obtener acceso a esa cuenta de usuario a través de un nombre de usuario y una contraseña, aunque estas dos ideas se combinan con frecuencia. Los describiré a ambos y luego explicaré cómo usar mi biblioteca SimpleImpersonation, que los usa internamente.

Interpretación

Las API para la suplantación se proporcionan en .NET a través de la System.Security.Principal espacio de nombres:

  • El código más nuevo (.NET 4.6+, .NET Core, etc.) generalmente debe usar WindowsIdentity.RunImpersonatedque acepta un identificador para el token de la cuenta de usuario y, a continuación, un Action o Func para que el código se ejecute.

    WindowsIdentity.RunImpersonated(tokenHandle, () =>
    
        // do whatever you want as this user.
    );
    

    o

    var result = WindowsIdentity.RunImpersonated(tokenHandle, () =>
    
        // do whatever you want as this user.
        return result;
    );
    
  • El código anterior usaba el WindowsIdentity.Impersonate método para recuperar un WindowsImpersonationContext objeto. Este objeto implementa IDisposablepor lo que generalmente debe llamarse desde un using cuadra.

    using (WindowsImpersonationContext context = WindowsIdentity.Impersonate(tokenHandle))
    
        // do whatever you want as this user.
    
    

    Si bien esta API todavía existe en .NET Framework, generalmente se debe evitar y no está disponible en .NET Core o .NET Standard.

Acceso a la cuenta de usuario

La API para usar un nombre de usuario y contraseña para obtener acceso a una cuenta de usuario en Windows es LogonUser – que es una API nativa de Win32. Actualmente no hay una API .NET integrada para llamarlo, por lo que se debe recurrir a P/Invoke.

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);

Esta es la definición de llamada básica, sin embargo, hay mucho más que considerar para usarla en producción:

  • Obtención de un identificador con el patrón de acceso “seguro”.
  • Cerrar correctamente los identificadores nativos
  • Niveles de confianza de seguridad de acceso de código (CAS) (solo en .NET Framework)
  • Paso SecureString cuando puede recopilar uno de forma segura a través de las pulsaciones de teclas del usuario.

La cantidad de código para escribir para ilustrar todo esto está más allá de lo que debería estar en una respuesta de StackOverflow, en mi humilde opinión.

Un enfoque combinado y más fácil

En lugar de escribir todo esto usted mismo, considere usar mi biblioteca SimpleImpersonation, que combina la suplantación de identidad y el acceso del usuario en una única API. Funciona bien en bases de código modernas y antiguas, con la misma API simple:

var credentials = new UserCredentials(domain, username, password);
Impersonation.RunAsUser(credentials, logonType, () =>

    // do whatever you want as this user.
); 

o

var credentials = new UserCredentials(domain, username, password);
var result = Impersonation.RunAsUser(credentials, logonType, () =>

    // do whatever you want as this user.
    return something;
);

Tenga en cuenta que es muy similar a la WindowsIdentity.RunImpersonated API, pero no requiere que sepa nada sobre identificadores de tokens.

Esta es la API a partir de la versión 3.0.0. Consulte el archivo Léame del proyecto para obtener más detalles. También tenga en cuenta que una versión anterior de la biblioteca usaba una API con el IDisposable patrón, similar a WindowsIdentity.Impersonate. La versión más nueva es mucho más segura y ambas se siguen usando internamente.

Aquí hay una buena descripción general de los conceptos de suplantación de identidad de .NET.

  • Michiel van Otegem: WindowsImpersonationContext simplificado
  • Método WindowsIdentity.Impersonate (consulte los ejemplos de código)

Básicamente, aprovechará estas clases que están listas para usar en el marco .NET:

  • WindowsSuplantaciónContexto
  • Identidad de Windows

Sin embargo, el código a menudo puede ser largo y es por eso que ve muchos ejemplos como el que hace referencia que intentan simplificar el proceso.

Esto es probablemente lo que quieres:

using System.Security.Principal;
using(WindowsIdentity.GetCurrent().Impersonate())

     //your code goes here

Pero realmente necesito más detalles para ayudarte. Puede hacer la suplantación con un archivo de configuración (si está tratando de hacer esto en un sitio web), o a través de decoradores de métodos (attributes) si es un servicio WCF, o a través de… entiendes la idea.

Además, si estamos hablando de suplantar a un cliente que llamó a un servicio en particular (o aplicación web), debe configurar el cliente correctamente para que pase los tokens apropiados.

Finalmente, si lo que realmente quiere hacer es Delegación, también necesita configurar AD correctamente para que los usuarios y las máquinas sean confiables para la delegación.

Editar:

Echar un vistazo aquí para ver cómo suplantar a un usuario diferente y para obtener más documentación.

Reseñas y puntuaciones

Si guardas alguna sospecha o capacidad de ascender nuestro ensayo eres capaz de ejecutar una reseña y con placer lo observaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *