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.