c# - mvc - Almacenamiento de una lista de cadenas en Reclamación(System.Security.Claims)
login identity asp net (2)
El ValueType
es una forma de que su código identifique cómo se debe interpretar / deserializar el valor, por ejemplo, que contiene un tipo de esquema XML. Si se usa entre códigos de diferentes fuentes, tiene sentido, pero en su propia aplicación, puede ignorarlo siempre que sepa cómo interpretar los contenidos.
Pero para tener múltiples valores, no necesitarás usar tipos complejos. Una identidad de reclamos puede tener varios reclamos con el mismo tipo de ClaimType
, por lo que en lugar de serializar los códigos en una cadena JSon, solo debe agregar varios reclamos; uno para cada código de usuario. Todos tienen el mismo tipo de reclamo. Eso permitirá utilizar el método HasClaim
para verificar si un código de usuario específico está presente.
Estoy desarrollando una aplicación web con el token de portador Asp.Net 5 MVC, Owin y Oauth2 como tipo de autenticación.
Necesito almacenar una lista de cadenas "CODEFOO,CODBAR,CODEX,.."
dentro de un System.Security.Claims.Claim con un tipo de reclamo personalizado.
Cuando el usuario solicita un token, esta lista de "códigos de usuario" se obtiene del back-end y se establece dentro de la identidad utilizando un tipo de reclamo personalizado específico.
Cuando el usuario envía el token de vuelta, navegando por una Acción MVC específica, la aplicación debe verificar si la lista de códigos de usuario dentro de la reclamación contiene un código específico.
List<string> userCodes = rep.GetUserCodeFromBackEnd();
string userCodesClaimType = "http://foo.it/claim/usercodesclaimtype";
Ahora mismo estoy serializando la lista de cadenas en JSON.
var claim = new Claim(userCodesCaimType, JsonConvert.SerializeObject(userCodes));
y recupérelo des-serializándolo con algo como esto:
var userCodesClaim = identity.Claims.FirstOrDefault<Claim>(c=>c.Type == userCodesClaimType) ;
var userCodesClaimValue = JsonConvert.DeserializeObject<List<string>>(userCodesClaim.Value);
Ahora la pregunta: ¿hay una mejor manera de almacenar una lista de valores dentro de una reclamación?
El reclamo tiene una propiedad ValueType que dice la documentación:
La propiedad ValueType contiene una cadena que identifica la información de tipo del valor. Esta propiedad se puede utilizar para comprender el formato del valor y para proporcionar información sobre cómo serializar y deserializar el valor. Si su solución requiere tipos de valor complejos, se recomienda que use tipos de esquema XML estándar en la propiedad ValueType para indicar cómo se pretende que la propiedad Value se serialice y deserialice desde una cadena.
Desafortunadamente no he encontrado ningún ejemplo que documente el uso de esa propiedad.
¿Está bien la serialización de Json o debo usar el enfoque ValueType?
Manténgase con JSON o use Multivalued Claim (atributo multivalor en términos de LDAP).
No confundamos System.Security.Claims.Claim.Type y Claim.ValueType. Tipo es el "Nombre del reclamo" (Nombre del atributo en lenguaje LDAP). Consulte System.Security.Claims.ClaimTypes para ver ejemplos de uris. ValueType es para la serialización XML. Consulte System.Security.Claims.ClaimValueTypes para ver ejemplos de uris.
Estabas pensando en utilizar ValueType para serializar correctamente. No es totalmente imposible, necesitarías programarlo tú mismo. Me temo que no hay muchos otros que puedan lidiar con esto (en un token de SAML). Así que no lo hagas, a menos que te estén apuntando con un arma. Dominick también te lo advirtió.
Necesitaría escribir algunas cosas, consulte: http://social.msdn.microsoft.com/Forums/vstudio/en-US/a11365c2-9b44-49db-97f2-50c30adff14d/complex-type-in-claims
Esto fue para WIF 3.5, pero el principio es el mismo en .NET 4.5.