2015-12-16 1 views
1

Dans notre ADFS 3.0, nous avons un magasin d'attributs personnalisé qui communique avec un service de repos pour extraire des attributs spécifiques en fonction de l'ID utilisateur. Ces attributs viennent avec une urne et une valeur. Mon but était de faire en sorte que l'urne soit récupérée à partir du service de repos défini sur le type de réclamation, mais ce type semble être défini dans le modèle que vous créez à partir de l'interface utilisateur d'ADFS. Voir ci-dessous le code:adfs 3.0 banque d'attributs personnalisés types de revendications dynamiques

c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"] 
=> issue(store = "Custom_AttributeStore", types = ("my:custom:urn"), query = "dummyString", param = c.Value); 

Est-il possible avec ADFS langage de règles de réclamation pour définir les types de revendications dans mon programme AttributeStore personnalisé?

Répondre

0

Il existe un moyen d'émettre dynamiquement n'importe quelle paire de type et de valeur de revendication à partir d'un magasin d'attributs personnalisé. This article m'a aidé à le comprendre.

Votre magasin d'attribut personnalisé a besoin de retourner une seule colonne de valeurs de chaîne, où chaque valeur représente un seul type de demande et sa valeur correspondante, séparés par un caractère spécial (un point-virgule dans cet exemple):

public string[][] EndExecuteQuery(IAsyncResult result) 
{ 
    ... 
    return new[] 
    { 
     new[] { "http://example/custom-type-1;Value 1" }, 
     new[] { "http://example/custom-type-2;Value 2" }, 
     ... 
    }; 
} 

Ensuite, utilisez une règle de revendication personnalisée pour extraire des valeurs de votre magasin d'attributs personnalisé et créer des revendications d'entrée d'un type arbitraire. Utilisez la commande add (qui crée des revendications d'entrée) au lieu de la commande issue (qui crée des revendications de sortie).

c:[Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"] => add(store = "YourCustomAttributeStore", types = ("custom-type-value-pair"), query = "YourQuery", param = c.Value); 

Enfin, utilisez une autre règle de revendication personnalisée pour ramasser chacune des revendications d'entrée créées à l'étape précédente et d'utiliser leurs valeurs pour émettre les demandes de sortie appropriées. La fonction RegexReplace peut être utilisée pour séparer le type et la valeur.

c:[Type == "custom-type-value-pair"] => issue(Type = RegexReplace(c.Value, ";.*$", ""), Value = RegexReplace(c.Value, "^.*?;", "")); 

Il peut être un peu compliqué, mais cela fonctionne.