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.RunImpersonated
que acepta un identificador para el token de la cuenta de usuario y, a continuación, unAction
oFunc
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 unWindowsImpersonationContext
objeto. Este objeto implementaIDisposable
por lo que generalmente debe llamarse desde unusing
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.