La création d'activités personnalisées dans Forefront Identity Manager (aujourd'hui Microsoft Identity Manager) nécessitait une compréhension de la programmation en C# ou VB.Net et du fonctionnement de Windows Workflow Foundation.
Microsoft a récemment publié la bibliothèque MIMWAL (MIM Workflow Activity Library) qui vous permet d'effectuer un grand nombre de tâches qu'une activité personnalisée pourrait faire sans avoir besoin de savoir comment programmer un langage .Net.
C'est un outil formidable, mais il faut un peu de temps pour apprendre à l'utiliser. J'ai eu la chance de travailler récemment sur un projet avec l'auteur du MIMWAL et j'ai pensé partager quelques scénarios courants pour aider les gens à se familiariser avec son utilisation.
Lire une ressource
Lors de la création de flux de travail personnalisés, l'une des premières choses à faire est de lire une ressource. Pour ce faire, dans le MIMWAL, vous utilisez l'activité "Mise à jour des ressources". Cette activité est très utilisée dans les projets MIMWAL car elle permet de lire les ressources et d'ajouter des valeurs aux données du flux de travail qui peuvent ensuite être utilisées pour mettre à jour une ressource.
Dans l'activité de mise à jour des ressources ci-dessous, la partie "Requêtes" de l'activité définit l'XPath pour interroger l'objet d'emplacement appelé "Default". Et de placer cette requête XPath dans la clé "DefaultLocation".
Ensuite, dans la section "Mises à jour", cette XPath est utilisée via [//Queries/DefaultLocation] pour mettre la valeur de l'exécution de la requête XPath dans la variable $DefaultLocation. La variable $DefaultLocation est ensuite définie (sur la deuxième ligne) comme étant la valeur de la variable [//WorkflowData/DefaultLocation]. Cela permet d'utiliser cette valeur dans les activités ultérieures du flux de travail en appelant [//WorkflowData/DefaultLocation].
Le graphique ci-dessus montre également qu'une variable peut être définie en lui donnant directement une valeur de chaîne de caractères.
"@domain.com" sera la valeur stockée dans [//WorkflowData/SMTPDomain].
Une autre façon de définir les attributs est d'utiliser un filtre XPath dans la section "Mises à jour" dans l'"Expression de valeur".
Par exemple :
IIF([IsPresent([//Target/Location]),[//Target/Location], "Default") )
Renvoie la valeur de l'attribut Location de la cible s'il est présent, sinon il renvoie la chaîne "Default".
Recherche efficace et recherche delta
Il existe deux fonctions de recherche utiles que j'ai utilisées dans un flux de travail pour valider la présence d'un code pays pour un utilisateur. L'attribut code pays a été créé pour répondre à l'exigence de présence d'un code pays en cas de présence de la valeur téléphone. Cependant, de nombreux utilisateurs disposaient déjà d'un attribut phone. Le flux de travail d'autorisation devait gérer ces scénarios :
- L'utilisateur ayant un attribut de téléphone existant ajoute un code de pays.
- L'utilisateur saisit un nouvel attribut téléphonique (ou modifie un attribut existant) et l'indicatif du pays.
- L'utilisateur saisit un attribut de téléphone (ou modifie un attribut existant) et aucun code de pays.
- L'utilisateur supprime un attribut du téléphone.
La recherche Delta fournira la valeur de l'attribut figurant dans le paramètre de la demande.
La recherche effective fonctionne dans les flux de travail AuthZ pour renvoyer la valeur de l'attribut après la validation de la demande (il s'agit de la même valeur que Delta si l'attribut est modifié au cours de cette demande, sinon il s'agit de la valeur actuelle de la cible).
La première étape du flux de travail AuthZ consiste donc à utiliser une activité de mise à jour des ressources pour définir certaines variables :
Les expressions de valeur définissent des valeurs booléennes pour déterminer s'il existe des données sur le Delta (ce qui est dans la demande), la Cible (ce qui est actuellement sur l'utilisateur) et l'Effectif (ce que sera le code pays après le traitement de la demande).
En outre, nous vérifions s'il existe une valeur "Office Phone" après le traitement de la demande. Nous l'utilisons à l'étape suivante : la vérification de la demande dans la condition d'exécution de l'activité.
Voici la demande de vérification :
La condition d'exécution de l'activité vérifie que l'attribut phone aura une valeur après l'envoi de la demande (valeur effective). S'il n'y a pas de valeur, la demande de vérification est acceptée. Dans le cas contraire, les conditions requises pour la demande sont vérifiées.
Voici la condition d'exécution de l'activité :
ConvertToBoolean([//WorkflowData/EffectiveOfficePhone])
Les conditions de demande requises seront utilisées pour déterminer si les données sont valides. Si la condition n'est pas remplie, le message "Denial Message" est renvoyé et l'accès est refusé.
Les conditions de la demande ci-dessus vérifient d'abord que le code du pays delta ou le code du pays cible sont présents. Si l'un ou l'autre est présent, la demande est valide pour cette condition :
Or(Eq([//WorkflowData/DeltaCountryCode],True),Eq([//WorkflowData/TargetCountryCode],True)
Le contrôle de validité suivant consiste à vérifier que le code de pays effectif est présent ou que le téléphone de bureau n'est pas présent (car si le téléphone est supprimé, le code de pays n'est pas nécessaire).
Or(Eq([//WorkflowData/EffectiveCountryCode],True),Eq([//WorkflowData/EffectiveOfficePhone],False)
Si ces deux vérifications sont positives, l'autorisation est accordée. Si l'un ou l'autre échoue, la demande est refusée et la valeur du message "Accès refusé" qui est renvoyé est la valeur de la première demande qui a échoué.
Le MIMWAL est un outil très pratique qui facilite et accélère la création de flux de travail complexes. J'ai hâte de l'utiliser dans de futurs projets.