2015-06-29 31 views
8

Sto utilizzando HostingEnvironment.QueueBackgroundWorkItem per eseguire il lavoro sullo sfondo di un'applicazione ASP.Net, in base al post del blog di Scott Hanselman How to run Background Tasks in ASP.NET.Utilizzare QueueBackgroundWorkItem con l'identità utente?

Mi piacerebbe eseguire l'attività in background come identità dell'utente corrente. Ho provato a passare un WindowsPrincipal e impostare Thread.CurrentPrincipal nell'azione, ma ciò non ha comportato l'esecuzione dell'azione come utente corrente.

È possibile, o l'utilizzo di HostingEnvironment implica sempre l'esecuzione come identità del pool di applicazioni?

Modifica

Non esattamente sul punto alla mia domanda iniziale, ma ho anche provato a passare un valore tramite CallContext.LogicalSetData() e CallContext.LogicalGetData(). Sul lato Get, il valore è sempre nullo.

Modifica # 2

provato anche questo sul lato queuing:

using (HostingEnvironment.Impersonate(windowsIdentity.Token)) 
{ 
    HostingEnvironment.QueueBackgroundWorkItem(work); 
} 

Quando il lavoro è in realtà fatto, il WindowsIdentity corrente nella azione è ancora l'identità del pool di app.

+2

I documenti dicono "Questo metodo sovraccarico non scorre ExecutionContext o SecurityContext dal chiamante al chiamato, pertanto i membri di tali oggetti, come la proprietà CurrentPrincipal, non passeranno dal chiamante al chiamato." https://msdn.microsoft.com/en-us/library/system.web.hosting.hostingenvironment.queuebackgroundworkitem(v=vs.110).aspx –

risposta

0

qualsiasi motivo specifico per cui è necessario "utilizzare" HostingEnvironment "?

oppure Hai provato a utilizzare WindowsImpersonationContext?

System.Security.Principal.WindowsImpersonationContext impersonationContext; 
impersonationContext = 
    ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate(); 

//Insert your code that runs under the security context of the authenticating user here. 

impersonationContext.Undo(); 

è possibile saperne di più come farlo here

+0

Vedere la spiegazione di cosa fa nel collegamento nella domanda. Deve essere programmato così com'è (help) per evitare che i thread vengano uccisi se AppDomain tenta di spegnersi. –

0

identità dell'utente corrente è collegato alla gestione della richiesta di filo, ed è valida solo per la durata di tale richiesta. Anche se hai passato un riferimento a HttpContext.Current.User.Identity alla tua funzione di lavoratore, scoprirai che potrebbe non essere più valido quando provi ad usarlo. Per quanto ne so, devi fare un po 'di lavoro con l'API di Windows per clonare il token di identità per creare un nuovo WindowsIdentity, che puoi utilizzare nella tua attività in background. Quindi, qualcosa di simile:

IntPtr copy = IntPtr.Zero, 
    token = ((WindowsIdentity)HttpContext.Current.User.Identity).Token; 
if (DuplicateToken(token, ref copy)) // the WinAPI function has more parameters, this is a hypothetical wrapper 
{ 
    return new WindowsIdentity(copy); 
} 
// handle failure 

passare questo WindowsIdentity alla tua attività in background, e impersonare quando è necessario. Non dimenticare di smaltirlo.