¿Hay una manera simple de hacerse pasar por un usuario en .NET?
Hasta ahora he estado usando esta clase del proyecto de código para todos mis requisitos de suplantación.
¿Hay una mejor manera de hacerlo usando .NET Framework?
Tengo un conjunto de credenciales de usuario (nombre de usuario, contraseña, nombre de dominio) que representa la identidad que necesito suplantar.
c#
.net
impersonation
ashwnacharya
fuente
fuente
Respuestas:
Aquí hay una buena descripción general de los conceptos de suplantación .NET
Básicamente, aprovechará estas clases que están listas para usar en .NET Framework:
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.
fuente
"Suplantación" en el espacio .NET generalmente significa ejecutar código bajo una cuenta de usuario específica. Es un concepto algo diferente que obtener acceso a esa cuenta de usuario a través de un nombre de usuario y contraseña, aunque estas dos ideas se combinan con frecuencia. Los describiré a ambos y luego explicaré cómo usar mi SimpleImpersonation biblioteca , que los usa internamente.
Interpretación
Las API para la suplantación se proporcionan en .NET a través del
System.Security.Principal
espacio de nombres:En general
WindowsIdentity.RunImpersonated
, se debe usar un código más nuevo (.NET 4.6+, .NET Core, etc.) , que acepta un identificador para el token de la cuenta de usuario, y luego un códigoAction
oFunc<T>
para que se ejecute el código.o
El código anterior usaba el
WindowsIdentity.Impersonate
método para recuperar unWindowsImpersonationContext
objeto. Este objeto se implementaIDisposable
, por lo que generalmente debe llamarse desde unusing
bloque.Si bien esta API todavía existe en .NET Framework, generalmente debe evitarse y no está disponible en .NET Core o .NET Standard.
Accediendo 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 incorporada para llamarlo, por lo que se debe recurrir a P / Invoke.Esta es la definición básica de la llamada, sin embargo, hay mucho más que considerar para usarla realmente en producción:
SecureString
cuando puede recoger 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 y el acceso del usuario en una sola API. Funciona bien en bases de código modernas y antiguas, con la misma API simple:
o
Tenga en cuenta que es muy similar a la
WindowsIdentity.RunImpersonated
API, pero no requiere que sepa nada sobre los identificadores de token.Esta es la API a partir de la versión 3.0.0. Vea el archivo Léame del proyecto para más detalles. También tenga en cuenta que una versión anterior de la biblioteca utilizaba una API con el
IDisposable
patrón, similar aWindowsIdentity.Impersonate
. La versión más nueva es mucho más segura, y ambas aún se usan internamente.fuente
Undo
se llama durante la eliminación.Esto es probablemente lo que quieres:
Pero realmente necesito más detalles para ayudarte. Puede suplantarse con un archivo de configuración (si está tratando de hacer esto en un sitio web), o mediante decoradores de métodos (atributos) si es un servicio WCF, o a través de ... se le ocurre la idea.
Además, si estamos hablando de suplantar a un cliente que llamó a un servicio 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 debe configurar AD correctamente para que los usuarios y las máquinas sean confiables para la delegación.
Editar:
Eche un vistazo aquí para ver cómo hacerse pasar por un usuario diferente y para obtener más documentación.
fuente
Aquí está mi puerto vb.net de la respuesta de Matt Johnson. Agregué una enumeración para los tipos de inicio de sesión.
LOGON32_LOGON_INTERACTIVE
fue el primer valor de enumeración que funcionó para el servidor sql. Mi cadena de conexión solo era de confianza. No hay nombre de usuario / contraseña en la cadena de conexión.Debe usar con una
Using
declaración para contener algún código para ejecutar suplantado.fuente
Ver más detalles de mi respuesta anterior He creado un paquete Nuget Nuget
Código en Github
muestra: puedes usar:
Ver el código completo:
fuente
Soy consciente de que llego bastante tarde a la fiesta, pero considero que la biblioteca de Phillip Allan-Harding es la mejor para este caso y otras similares.
Solo necesita un pequeño fragmento de código como este:
Y agrega su clase:
Suplantación de identidad .NET (C #) con credenciales de red
Mi ejemplo se puede usar si necesita que el inicio de sesión suplantado tenga credenciales de red, pero tiene más opciones.
fuente
Puedes usar esta solución. (Use el paquete nuget) El código fuente está disponible en: Github: https://github.com/michelcedric/UserImpersonation
Más detalles https://michelcedric.wordpress.com/2015/09/03/usurpation-didentite-dun-user-c-user-impersonation/
fuente