Continuamos el estudio de todo lo relacionado a las claims respondiendo una pregunta clave: Si en .NET 4.5 todo el modelo de seguridad se ha movido hacia un esquema basado en claims, ¿Qué pasa con mis viejas aplicaciones que hacían uso de Identity y Principal?
Para responder una imagen vale más que mil palabras. Así está la jerarquía de clases del Framework relativa a identidades (como veis he añadido una clase de mi cosecha, hablamos de ella luego):
¿Qué quiere decir todo esto? Pues que efectivamente todo son claims, como veis, un GenericIdentity de los de antes ahora a pasado a heredar de ClaimsIdentity, mientras que en versiones previas del framework, esta clase implementaba directamente IIdentity.
Si instanciamos una identidad genérica, por debajo estamos instanciando una identidad basada en claims. ¿Cuál será la salida del siguiente código?
1: static void Main(string[] args)
2: {
3: var oldIdentity = new GenericIdentity("Sergio");
4:
5: foreach(var cl in oldIdentity.Claims)
6: {
7: Console.WriteLine("Tipo:{0} Valor:{1}", cl.Type, cl.Value);
8: }
9: }
Aquí la teneis, la identidad almacena un único claim, cuyo tipo es http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name
Parece claro que la compatibilidad hacia atrás está garantizada, ya que este esquema que os acabo de presentar se sigue también para los objetos tipo principal.
Generando nuestra propias identidades
En la entrada anterior (Claims Series 2: Un poco de código por favor) veíamos como podíamos crear identidades generando una colección de claims. Es sencillo, pero desde luego no es muy elegante:
1: var cl1=new Claim("http://serginet.com/categoria","senior");
2: var cl2=new Claim("http://serginet.com/edad","36");
3: var cl3=new Claim("http://serginet.com/ciudad","Arroyomolinos");
4:
5: var identidad = new ClaimsIdentity(new List<Claim>() { cl1, cl2, cl3 });
Vemos que en el Framework han usado herencia... ¿por que no usarla nosotros también?
Creemos nuestra propia identidad, heredando de ClaimsIdentity y aprovechemos a exponer propiedades para las claims almacenadas.
1: public class SerginetIdentity: ClaimsIdentity
2: {
3: public const string CTE_CategoriaProfesional = "http://serginet.com/categoriaProfesional";
4: public const string CTE_Edad = "http://serginet.com/edad";
5: public const string CTE_AccesoDocumentosSecretos = "http://serginet.com/accesoDocumentosSecretos";
6:
7: public SerginetIdentity(string categoriaProfesional, int edad, bool accesoDocumentosSecretos)
8: {
9: var cl1=new Claim(CTE_CategoriaProfesional,categoriaProfesional);
10: var cl2=new Claim(CTE_Edad,edad.ToString());
11: var cl3=new Claim(CTE_AccesoDocumentosSecretos,accesoDocumentosSecretos.ToString());
12:
13:
14: this.AddClaims(new List<Claim>() { cl1, cl2, cl3 });
15: }
16:
17: public string CategoriaProfesional
18: {
19: get
20: {
21: return this.FindFirst(CTE_CategoriaProfesional).Value;
22: }
23: }
24:
25: public int Edad
26: {
27: get
28: {
29: return int.Parse(this.FindFirst(CTE_Edad).Value);
30: }
31: }
32:
33: public bool AccesoDocumentosSecretos
34: {
35: get
36: {
37: return Boolean.Parse(this.FindFirst(CTE_AccesoDocumentosSecretos).Value);
38: }
39: }
40:
41: }
Como veis es sencillo, fácil de usar desde fuera, y será la base de la próxima entrada: Transformando claims.
Como siempre os dejo el código
Posts publicados en Claims Series:
- Claims Series 1: Una introducción a claims para profanos, como yo :-)
- Claims Series 2: Un poco de código por favor
- Claims Series 3: Herencia y compatibilidad