work with threadstart threads thread new net multi method example book c# multithreading principal security-context

with - threadstart c#



¿Cómo comienzo un hilo en un contexto de seguridad diferente? (2)

¿Cómo iniciar un hilo en el contexto de seguridad de un usuario diferente? Cuando un proceso comienza un hilo, normalmente también se pasa el contexto de seguridad, pero ¿cómo iniciar un hilo en un contexto de seguridad diferente con el principal de un usuario diferente?


He usado técnicas como esta para suplantar con éxito.

El término "Suplantación de identidad" en un contexto de programación se refiere a una técnica que ejecuta el código en otro contexto de usuario que el usuario que originalmente inició una aplicación, es decir, el contexto de usuario se cambia temporalmente una o más veces durante la ejecución de una aplicación.

La razón para hacer esto es realizar tareas que el contexto de usuario actual de una aplicación no puede hacer. Por supuesto, podría otorgar al usuario que ejecuta una aplicación más privilegios, pero generalmente esta es una mala idea (debido a restricciones de seguridad) o imposible (por ejemplo, si no tiene acceso administrativo completo a una máquina para hacerlo).


Creo que puede simplemente configurar el CurrentPrincipal como la primera operación del código del hilo una vez que se inició el hilo, y solo entonces comenzar a ejecutar el código que se supone que se ejecutará con el otro principal.

Esto debería encargarse de cualquier verificación .NET basada en roles. Si necesita personificación también para llamadas al sistema operativo, puede hacerse pasar por WindowsIdentity .

Código (puede o no funcionar, no lo probó):

public void Run(object principalObj) { if (principalObj == null) { throw new ArgumentNullException("principalObj"); } IPrincipal principal = (IPrincipal)principalObj; Thread.CurrentPrincipal = principal; WindowsIdentity identity = principal.Identity as WindowsIdentity; WindowsImpersonationContext impersonationContext = null; if (identity != null) { impersonationContext = identity.Impersonate(); } try { // your code here } finally { if (impersonationContext != null) { impersonationContext.Undo(); } } } ... Thread thread = new Thread(Run); thread.Start(yourPrincipal);