Utilizzando i Workflow Service, nonostante lo stack di attivazione del servizio sia quello di WCF, esiste una grossa differenza nel caso si abbia la necessità di recuperare l’identity del chiamante, ad esempio se si utilizza WIF per l’autenticazione Claim Based.
Normalmente in un servizio WCF si accede all’identity tramite il context:
ClaimsIdentity claims = ((ClaimsIdentity)System.Threading.Thread.CurrentPrincipal.Identity);
nel caso dei Workflow, bisogna invece accedere al SecurityContext:
OperationContext.Current.SecurityContext.PrimaryIdentity
Il problema è che, di default, l’OperationContextScope non è disponibile per l’utilizzo diretto.
Le mie moltissime ricerche in rete mi hanno portato a trovare tre possibilità per risolvere il problema:
- Realizzare una custom activity seguendo quanto riportato su MSDN (http://msdn.microsoft.com/en-us/library/aa395196.aspx)
- Utilizzare il WF Security Pack, ed in particolare l’activity OperationContextScope (http://wf.codeplex.com ) il cui stadio di sviluppo è però ancora CTP 1 da orami un anno
- Utilizzare il Neovolve Toolkit (http://www.neovolve.com/ ) attraverso l’activity ReceiveIdentityInspector
Quest’ultima soluzione consente di “catturare” l’identity e salvarla in una variabile del WF.
Il linea di massima le soluzioni 2 e 3 (pronte per l’uso) sembrano abbastanza equivalenti, ma nell’utilizzo pratico del WF Security Pack, si sono verificate delle anomalie attivando la funzionalità di persistenza di AppFabric.
Sostanzialmente il workflow resta legato all’owner di sistema che si occupa della sua creazione e non è più possibile invocare le operation successive a quelle di init (createinstance).
L’activity di Neovoleve, invece, funziona correttamente ed ha il vantaggio di salvare l’identity senza la necessità di rendere le activity che devono utilizzarla, figlie di una parent activity.
Consiglio inoltre di spulciarvi l’intero Neovoleve Toolkit, che contiene diverse activity interessanti, come quella che consente di prende l’Id di persistenza legato all’istanza (GetWorkflowInstanceId), particolarmente utile in fase di debug, che, come tutti i dev WF4 sanno, non è proprio il massimo.