L'impersonate di asp.net e i thread

Ieri notte, insieme al mio amico Fabio, stavamo sviluppando un applicazione web non eccessivamente complessa fino a quando non si è verificato un problema di permessi.
Entro meglio nel dettaglio per far capire la cosa:
La prima caratteristica dell'applicazione è che dovendo accedere a determinate cartelle protette non doveva usare l'utente ASP.NET per eseguire le operazioni, ma bensi un utente membro di un dominio che per comodiftà chiamerò farmuser.
Per far si che l'utente utilizzato non sia asp.net basta andare ad aggiungere nel web.config la riga sull'identity, come la seguente:

<identity impersonate="true" userName="farmuser" password="farmpass" />

Fatto ciò sembra tutto ok, fino a quando non andavamo a utilizzare dei thread in una situazione simile alla seguente:

La pagina aspx lancia un nuovo thread (nel mio caso passando per un metodo statico) ed seguiva un blocco di codice tipo il seguente:

indexerThread = new Thread(new ThreadStart(Run)); 
indexerThread.Priority = ThreadPriority.Lowest; 
indexerThread.Name = "Indexer"; 
indexerThread.Start();

Il metodo statico run eseguiva delle operazioni su file, e qui sono cominciati gli errori. :)

L'inghippo lo abbiamo trovato nei nuovi file creati dal metodo run che avevano come utente ASP.NET, ma poi quando dovevano essere rinominati e/o cancellati dall'utente farmuser, il runtime ci stampava un bell'errore di accesso negato.

Armati di pazienza (molta più Fabio che io) tramite

WindowsIdentity.GetCurrent().Name 

ci siamo messi a cercare dove veniva cambiato l'utente e questo avveniva all'interno del metodo run; quindi se da una pagina asp.net si lancia un thread anche se si ha impostato l'imperosnificazione dell'utente asp.net nel web config, il secondo thread ha sempre come user ASP.NET.

Per risolvere il problema (dopo vari tentativi e ricerche su google) siamo arrivati a questa soluzione:

internal static System.Security.Principal.WindowsIdentity ApplicationIdentity; 

dentro il nostro metodo statico

ApplicationIdentity = System.Security.Principal.WindowsIdentity.GetCurrent();
indexerThread = new Thread(new ThreadStart(Run)); 
indexerThread.Priority = ThreadPriority.Lowest; 
indexerThread.Name = "Indexer"; 
indexerThread.Start();

e dentro il run

ApplicationIdentity.Impersonate();

 

 

 


Comments