Code First Database Evolution

El otro día en las oficinas del grupo de Data Programability en Redmon tuve la ocasión de estar un buen rato con dos enormes personas de producto, Danniel Simmons y Diego Vega, más allá de aspectos conceptuales y feedback uno de los temas que se tocó con respecto al futuro de EF fué el soporte de evolución de esquemas relaciones sin necesidad de volver a diseñar, recompilar etc, creo que no me equivoco si digo que esta feature es lo que más echan de menos equipos que hacen ERP por ejemplo. Pues bien, por fin acaban de publicar un video en el que de forma pública enseñan el camino posible que están tomando, espero que os guste tanto como a mi 🙂

 

Saludos

Unai

WIF: Autorización dentro del pileline de WIF

La verdad es que más alla de distintos eventos que he tenido la suerte de impartir sobre WIF, casi todos relacionados con los workshop de arquitectura en Microsoft España, no he escrito nada de esta tecnología que me llamó la atención y me pareció excelente desde que se conocía como Zermatt.

Aunque trataré de ser lo más variado posible intentaré darle un repaso a distintos elementos de WIF, sin dar un 101 de entrada, para eso están los tan bien hechos Training Kits.

 

En esta ocación me gustaría comentar como incluir el mecanismo de validación, transformación y autorización de claims una vez se haya realizado el pipeline completo de WIF, es decir, una vez que el STS haya devuelto el token al RP. Si uno revisa la documentación, verá rápidamente como existe una clase base denominada ClaimsAuthorizationManager que nos permitirá realizar esta tarea de una forma fácil, puesto que solamente tenemos que heredar de ella y sobreescribir el método CheckAccess, como se puede ver en el siguiente trozo de código.

El elemento AuthorizationContext, definido perfectamente en MSDN aquí,  nos permite tener acceso a tres elementos fundamentales, por un lado el recurso o recursos a los que se desea acceder, por ejemplo si estamos dentro de un sitio WEB ASP.NET securizado con WS-Federation nos dirá la página que se ha solicitado, otro de los elementos proporcionados por esta clase AuthorizationContext consiste en el Action o verbo utilizado ( GET o POST si es por ejemplo un servicio WCF ). Para terminar el último elemento proporcionado por el contexto enviado al método CheckAccess es el IPrincipal establecido o autenticado dentro del STS y para el cual disponemos de un token de seguridad.

 

Una vez creado nuestra clase y establecida la lógica de negocio que deseemos tendremos que realizar un par de pasos para establecerlo. El primero es acudir a la configuración de nuestro RP y en la sección Microsoft.IdentityModel incluir el elemento ClaimsAuthorizationManager dentro de services

 

Una vez hecho esto aún nos queda un nuevo paso, de hecho a mucha gente se le olvida y suele ser una de las preguntas frecuentes de foros y mails :-). Por defecto, WIF no incluye dentro de su procesamiento la autorización de los tokens recibidos, solamente la autenticación y el establecimiento de la sesión para los cuales debemos de incluir dos módulos http.

 

Untitled

Si queremos agregar dentro de la cadena de procesamiento el uso de autorización de claims deberemos de incluir un nuevo módulo que es el siguiente:

<add name="ClaimsAuthorizationModule" type="Microsoft.IdentityModel.Web.ClaimsAuthorizationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" preCondition="managedHandler"/>

Lógicamente si usas WebDev.WebServer tienes que incluirlo también en la sección httpModules

 

Con estos sencillos pasos ya sabemos como habilitar el procesamiento de autorizaciónes de claims. Como extra a estos podríamos extender el elemento ClaimsAuthorizationManager de la siguiente forma:

 

<claimsAuthorizationManager type="Utils.GeekClaimAuthorizationManager">

       <policy resource="/[RESOURCE]" action="GET" claimName="[ClaimName]" claimValue="[ClaimValue]"/>

  </claimsAuthorizationManager>

Si os fijais el contenido incluido dentro del elemento ClaimAuthorizationManager es completamente personalizado, y nos podría valer por ejemplo para establecer la configuración que querramos a nuestro sistema de autorización. Para que el mismo reciba esta información solamente tendremos que agregarle un contructor nuevo que tome un XmlNodeList, como se muestra a continuación.

Saludos

Unai