2011-12-12 13 views
5

Tengo un proyecto asp.net donde la solicitud delegará el trabajo al fondo (a través de quartz.net). La aplicación web está usando autenticación y suplantación de Windows.Ventanas Duplicación y duplicación de tokens

También me gustaría suplantar al usuario actual en el hilo de fondo también. He leído cómo hacerse pasar por un usuario con un nombre de dominio, un nombre de usuario y una contraseña proporcionados y llamando al kernel. Ese método funciona.

IntPtr token; 
var successfullLogon = LogonUser(userName, password, domain, logonType, logonProvider, out token); 
if(successfullLogon == false) 
{ 
    var errorCode = Marshal.GetHRForLastWin32Error(); 
    Marshal.ThrowExceptionForHR(errorCode); 
} 

que funciona, pero me obliga a bien proporcionar un nombre de usuario/contraseña específica, o tener el usuario introduzca su contraseña. ninguna de las situaciones es ideal.

Lo que me gustaría es pasar el token de la identidad del usuario de la solicitud al fondo y luego suplantar al usuario de este token existente. He leído que yo debería ser capaz de llamar a DuplicateHandle,

var token = ((WindowsIdentity)Request.User.Identity).GetToken().ToInt64(); 
var token = new IntPrt(token from request); 
IntPtr duplicate; 
try 
{ 
    if(NaviteMethod.DuplicateToken(token, SecurityImpersonationLevel.Impersonate, out duplicate) == false) 
    { 
     var errorCode = Marshal.GetHRForLastWin32Error(); 
     Marshal.ThrowExceptionForHR(errorCode); 
    } 

    using(var identity = new WindowsIdentity(duplicate)) 
    using(var context = identity.Impersonate()) 
    { 
     //do work 
     context.Undo(); 
    } 
} 
finally 
{ 
    if(duplicate != IntPtr.Zero) 
    { 
     NaviteMethod.CloseHandler(duplicate); 
    } 
} 

Pero consigo una excepción operación de E/S superpuesta está en curso

Las llamadas NativeMethod provienen de este post: How do I pass credentials to a machine so I can use Microsoft.Win32.RegistryKey.OpenRemoteBaseKey() on it?

¿Es posible usar el token del usuario actual y suplantar al usuario en un hilo de fondo? En caso afirmativo, ¿cómo se puede hacer esto y existen derechos de acceso del usuario necesarios para que esto ocurra?

Respuesta

1

Desafortunadamente, no puede omitir el "Usuario de inicio de sesión". Una opción es usar ASP.NET Impersonation. El segundo ya lo tiene si reemplaza las primeras dos líneas de su segundo bloque de código con el primer código de bloque.

+0

Ya estoy usando suplantación para las solicitudes http. este código se ejecuta en segundo plano por lo que es independiente de la suplantación asp.net. la segunda opción es la que tengo actualmente y parece ser la solución con la que me quedaré. –

+0

Excelente elección. Le ahorrará su tiempo. –

Cuestiones relacionadas