Thread.CurrentPrincipal

El Client Application Services que podem implementar a la nostre aplicació WPF ens permet validar a un usuari d’una manera molt senzilla. Aquesta validació es guarda a una propietat CurrentPrincipal del thread. El problema és que la autentificació es guarda al thread que ha provocat la verificació. Però què passa quan es creen threads secundaris? Per internet hi ha articles que es diu que els threads secundaris hereden el CurrentPrincipal del Thread principal però no ho he provat, el que si que he provat és que els threads creats per la crida de funcions asíncrones per Beginxxxx no hereden aquesta propietat. El problema que hi ha és que si llavors executem alguna crida a algun servei web aquest no està amb autentificació.

Una de les solucions que ens podem buscar és la d’utlitzar el mètode SetThreadPrincipal de la classe AppDomain. Aquest mètode serveix per indicar quin és el CurrentPrincipal per defecte que tindran tots els threads del domini. És correcte i útil però té el problema que només es pot assignar una sola vegada. Quan es vol assignar una segona vegada provoca una excepció PolicyException, per tant, per els escenaris on es fa login/logout per després poder fer un altre login no ens serveix.

try
{
AppDomain.CurrentDomain.SetThreadPrincipal(Thread.CurrentPrincipal);
}
catch (System.Security.Policy.PolicyException) { }

Indagant per el .Net no m’ha quedat una altre alternativa que crear una classe estàtica ApplicationContext on per una propietat CurrentPrincipal l’hi assigno el IPrincipal que tinc en cada moment que es fa el login.

Anuncis

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out / Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out / Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out / Canvia )

Google+ photo

Esteu comentant fent servir el compte Google+. Log Out / Canvia )

S'està connectant a %s