Impersonate a Thread in Asp.net

Claudia RossiAsp.net da la possibilità di gestire l’identità con cui viene eseguito un sito. Farlo in modo generico è molto semplice.
Nel file web.config inseriamo queste due righe di XML

<identity impersonate="true"
userName="xxx"
password="yyy"/>

Il problema è che se noi lanciamo un Thread asincrono, questo per motivi di sicurezza non viene eseguito dall’utente che abbiamo dichiarato noi, ma viene eseguito dall’utente di default del server (ASPNET).

A questo punto le scelte sono 2: cambiare il comportamento dell’intero server o fare una "furbata".
Per cambiare il comportamente dell’intero server bisogna modifcare il file aspnet.config presente nella directory:
%Windir%Microsoft.NET\Framework\{Version Number\

Aggiungendo:

<configuration> <runtime> <alwaysFlowImpersonationPolicy enabled="true"/> <legacyImpersonationPolicy enabled="false"/> </runtime> </configuration>

Per fare una cosa fatta meglio possiamo procedere in questo modo.
Premesso che abbiamo già definito l’utente che esegue il processo (nel web.config) dobbiamo fare in modo di comunicare al Thread di usare tale utente, e per questo utilizziamo il metodo Impersonate della classe windows.security.principal.WindowsIdentity.

Quindi creiamo l’oggetto  da passare al Thred, comprensivo di un oggetto WindowsIdentity, quindi all’interno del Thred facciamo una Impersonate(). Vediamo il codice.

[...]
//preparo l'oggetto per i parametri
MyThreadObj zc = new MyThreadObj();
zc.a = "Denis Milani";
zc.b = "Rosaria Cannavò";
zc.c = "Sara Varone";
//setto l'identity
zc.wi = System.Security.Principal.WindowsIdentity.GetCurrent();         
//lancio il thread
Thread t = new Thread(new ParameterizedThreadStart(ThreadProc));
t.Start(zc);
[...]
private void ThreadProc(object o)
{
   //lancio l'impersonate
   String me;
   MyThreadObj zc = (MyThreadObj)o;
   //eseguo impersonate
   WindowsImpersonationContext impersonationContext = zc.wi.Impersonate();
   me = WindowsIdentity.GetCurrent().Name;
   //recupero il tipo di oggetto corretto
   [...operazioni del Thread... ]
   impersonationContext.Undo();
   me = WindowsIdentity.GetCurrent().ToString();
}
[...]

Ho inserito anche la stringa me all’interno del codice in modo possiate vedere l’effettivo mantenimento della Identity via debug. Per maggiori info sulla Impersonate » e sui Thread »

p.s: I valori passati al Thred, molto femminili, servono solamente per intervenire sul mio personale stato di Stress, aumentando le quantità di testosterone circolanti. E in omaggio vi metto pure una foto della splendida Claudia Rossi 🙂 Spero che gli amici programmatori puritani  e  omosessuali non me ne vogliano! Questo blog è cmq sempre crossover.

Loading Facebook Comments ...

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *