En la anterior entrega de esta serie vimos como extender el mecanismo de claims para hacer uso de un ClaimsAuthenticationManager, gracias al cual, podríamos modificar, agregar o eliminar claims de la identidad con la que se authenticara un usuario. Vimos además, como dependiendo del tipo de cliente el uso de esta pieza es diferente. A lo largo de esta entrega, veremos otro de los elementos fundamentales de la plataforma de identidad representado por la clase ClaimsAuthorizationManager, pieza que tal como se puede entender por su nombre se encarga de realizar autorización de credenciales. La autorización de credenciales nos permite restringir el acceso a un recurso dado, tanto de forma declarativa como imperativa gracias a ClaimsPrincipalPermission y ClaimsPrincipalPermissionAttribute.
ClaimsAuthorizationManager
Como lo primero es lo primero empezaremos por crear y configurar un ClaimsAuthorizationManager simple, para ello, como hacíamos en la entrada anterior solamente tenemos que crear nuestra implementación y registrarla dentro de la sección de configuración del sistema de identidad nuevo System.identityModel.
1 |
<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> NoOpClaimsAuthorizationManager |
1 |
:ClaimsAuthorizationManager |
1 |
  |
1 |
<span style="color: #0000ff">public</span> <span style="color: #0000ff">override</span> <span style="color: #0000ff">bool</span> CheckAccess(AuthorizationContext context) |
1 |
{ |
1 |
<span style="color: #0000ff">return</span> <span style="color: #0000ff">base</span>.CheckAccess(context); |
1 |
} |
1 |
<system.identityModel > |
1 |
<identityConfiguration name=<span style="color: #006080">"MyIdentity"</span>> |
1 |
<claimsAuthenticationManager type=<span style="color: #006080">"ClaimsAuthentication.PassThrougClaimsAuthenticationManager,ClaimsAuthentication"</span>/> |
1 |
<claimsAuthorizationManager type=<span style="color: #006080">"ClaimsAuthentication.NoOpClaimsAuthorizationManager,ClaimsAuthentication"</span>/> |
1 |
</identityConfiguration> |
1 |
</system.identityModel> |
Una vez registrado nuestra implementación y configurada, ya podremos revisar su funcionamiento, para ello, podemos simplemente hacer uso de ClaimsPrincipalPermissionAttribute como se ve a continuación.
1 |
[ClaimsPrincipalPermission(SecurityAction.Demand,Operation = <span style="color: #006080">"DeclarativeAuthorize"</span>,Resource=<span style="color: #006080">"Main"</span>)] |
1 |
<span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> DeclarativeAuthorize() |
1 |
{ |
1 |
1 |
} |
Si se fija, el código es idéntico al usado en versiones anteriores del framework con PrincipalPermission, si acaso, la diferencia está en que ahora no hablamos de usuarios/roles sino recursos y operaciones. Pues bien, antes de cualquier llamada a este método se proceder´´a a verificar el acceso de la identidad actual en el método CheckAccess, el cual tomará como parámetro un contexto con la información de la identidad actual y el[los] recurso[s] y operación[es] que se quieren autorizar.
En un entorno web, como MVC tenemos la pega de que el atributo Authorize no está preparado para trabajar con claims, aún sigue pidiendo usuario / roles, sin embargo, no tardaríamos mucho en realizar una implementación que se adaptara a nuestro gusto y necesidades. Mientras tanto, lógicamente podemos solicitar la autorización de forma imperativa como se ve en esta trivial acción de un controlador.
1 |
<span style="color: #0000ff">public</span> ActionResult About() |
1 |
{ |
1 |
ClaimsPrincipalPermission.CheckAccess(<span style="color: #006080">"Home"</span>, <span style="color: #006080">"About"</span>); |
1 |
  |
1 |
ViewBag.Message = <span style="color: #006080">"Your app description page."</span>; |
1 |
  |
1 |
<span style="color: #0000ff">return</span> View(); |
1 |
} |
Nota: Revisando un poco las implementaciones he visto una implementación de un atributo de autorización basado en claims para MVC de Dominick Baier que prodría utilizarse sin problemas, el ejemplo y la descarga pueden obtenerse desde aquí.
Aunque ha sido corta, espero que esta entrada os haya resultado de vuestro agrado
Un saludo
Unai