2014-07-20 3 views
15

Je suis en train de développer une application web avec un jeton support Asp.Net 5 MVC, Owin et Oauth2 comme type d'authentification.Stockage d'une liste de chaînes dans Claim (System.Security.Claims)

Je dois stocker une liste de la chaîne "CODEFOO,CODBAR,CODEX,.." à l'intérieur d'un System.Security.Claims.Claim avec un type de revendication personnalisé. Lorsque l'utilisateur demande un jeton, cette liste de "codes d'utilisateur" provient du serveur principal et est définie à l'intérieur de l'identité en utilisant un type de revendication personnalisé spécifique.
Lorsque l'utilisateur renvoie le jeton, naviguant dans une action MVC spécifique, l'application doit vérifier si la liste des codes utilisateur à l'intérieur de la revendication contient un code spécifique.

List<string> userCodes = rep.GetUserCodeFromBackEnd(); 
string userCodesClaimType = "http://foo.it/claim/usercodesclaimtype"; 

Je suis en train de sérialiser la liste de chaînes dans JSON.

var claim = new Claim(userCodesCaimType, JsonConvert.SerializeObject(userCodes)); 

et le récupérerez dé-sérialisation avec quelque chose comme ceci:

var userCodesClaim = identity.Claims.FirstOrDefault<Claim>(c=>c.Type == userCodesClaimType) ; 
var userCodesClaimValue = JsonConvert.DeserializeObject<List<string>>(userCodesClaim.Value); 

Maintenant la question: est-il une meilleure façon de stocker une liste de valeurs dans une réclamation?
revendication a une propriété ValueType qui dit la documentation:

La propriété ValueType contient une chaîne qui identifie le type informations de la valeur. Cette propriété peut être utilisée pour comprendre le format de la valeur et pour fournir des informations sur la façon de sérialiser et de désérialiser la valeur. Si votre solution requiert des types complexes de type , il est recommandé d'utiliser des types de schéma XML standard dans la propriété ValueType pour indiquer comment la propriété Value est censée être sérialisée et désérialisée à partir d'une chaîne.

Malheureusement, je n'ai trouvé aucun exemple documentant l'utilisation de cette propriété.
La sérialisation JSON est-elle correcte ou dois-je utiliser l'approche ValueType?

+0

Pourquoi n'ajoutez-vous pas plusieurs revendications? –

Répondre

15

Le ValueType est un moyen pour votre code d'identifier comment la valeur doit être interprétée/désérialisée, comme par exemple contenir un type de schéma XML. S'il est utilisé entre des sources différentes, il est logique, mais dans votre propre application, vous pouvez simplement l'ignorer tant que vous savez interpréter le contenu.

Mais pour avoir plusieurs valeurs, vous n'aurez pas besoin d'utiliser des types complexes. Une revendication peut avoir plusieurs revendications avec le même ClaimType, donc au lieu de sérialiser les codes dans une chaîne JSon, vous devez simplement ajouter plusieurs revendications; un pour chaque code d'utilisateur. Tous ayant le même type de revendication. Cela permettra d'utiliser la méthode HasClaim pour vérifier si un code utilisateur spécifique est présent.

+0

Je crois que vous confondez 'ValueType', qui représente le type de la valeur, avec le type de revendication. – systempuntoout

+0

Vous avez totalement raison, mis à jour ma réponse. –

4

Coller avec JSON ou utiliser une revendication à valeurs multiples (attribut à valeurs multiples dans les termes LDAP).

Ne confondons pas System.Security.Claims.Claim.Type et Claim.ValueType. Le type est le "Nom de revendication" (nom d'attribut dans le langage LDAP). Voir System.Security.Claims.ClaimTypes pour l'exemple d'uris. ValueType est pour la sérialisation XML. Voir System.Security.Claims.ClaimValueTypes pour l'exemple d'uris.

Vous envisagiez d'utiliser ValueType pour sérialiser correctement. Ce n'est pas totalement impossible, vous devrez le programmer vous-même. J'ai peur qu'il n'y en ait pas beaucoup d'autres qui peuvent s'en occuper (dans un Token SAML). Alors ne le faites pas, à moins qu'ils ne vous tiennent une arme à feu. Dominick vous a également prévenu.

Vous auriez besoin d'écrire certaines choses, voir: http://social.msdn.microsoft.com/Forums/vstudio/en-US/a11365c2-9b44-49db-97f2-50c30adff14d/complex-type-in-claims C'était pour WIF 3.5, mais le principe est le même sous .NET 4.5.

+0

Merci pour vos commentaires. Je pense que je vais essayer de créer plusieurs revendications avec le même type que suggéré par Anders Abel. – systempuntoout

Questions connexes