2011-12-12 8 views
5

Ho un progetto asp.net in cui la richiesta delegherà il lavoro in background (tramite quartz.net). L'applicazione Web utilizza l'autenticazione e la rappresentazione di Windows.Windows Rappresentazione e duplicazione dei token

Vorrei anche impersonare l'utente corrente sul thread in background. Ho letto come impersonare un utente con un nome di dominio, nome utente e password forniti e chiamando il kernel. Quel metodo funziona.

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

che funziona, ma mi obbliga a presentare una specifica nome utente/password, o hanno l'utente immettere la propria password. nessuna situazione è l'ideale.

Quello che mi piacerebbe è passare il token dall'identità dell'utente dalla richiesta allo sfondo e quindi impersonare l'utente da questo token esistente. Ho letto che dovrei essere in grado di chiamare 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); 
    } 
} 

Ma ottengo un'eccezione operazione sovrapposta di I/O è nel corso

Le chiamate NativeMethod provengono da questo post: How do I pass credentials to a machine so I can use Microsoft.Win32.RegistryKey.OpenRemoteBaseKey() on it?

È possibile utilizzare il token dell'utente corrente e impersonare quell'utente su un thread in background? In tal caso, come si può fare e ci sono diritti di accesso utente necessari per questo?

risposta

1

Purtroppo non è possibile ignorare "LogonUser". Un'opzione è usare ASP.NET Impersonation. Il secondo lo hai già se sostituisci le prime due righe del tuo secondo blocco di codice con il primo codice di blocco.

+0

Sto già utilizzando la rappresentazione per le richieste http. questo codice viene eseguito in background, quindi è indipendente dalla rappresentazione di asp.net. la seconda opzione è ciò che attualmente ho in atto e sembra essere la soluzione con cui mi attaccherò. –

+0

Scelta eccellente. Ti farà risparmiare tempo. –

Problemi correlati