Security Application Block

La funcionalidad de Security Application Block puede dividirse en dos partes independientes que analizaremos por separado: Una interfaz de autorización y una sistema de caching de credenciales.

Interfaz de Autorización

Security Application Block define una sencilla interfaz para realizar autorización en una aplicación, su nombre es IAuthorizationProvider y tiene un solo miembro, el método Authorize().
Se incluye dos implementaciones de esta interfaz que se denominan proveedores de autorización: Un utiliza Autorization Manger (AzMan) para difinir las reglas de autorización, y el segundo utiliza el archivo de configuración para definir las reglas de autorización.

Las ventajas de usar Security Application Block son:

  • Reduce la necesidad de escribir código repetitivo, la interfaz encapsula los detalles particulares de cada mecanismo de autorización.
  • Disminuye la curva de aprendizaje para los programadores evitándoles aprender a usar diferentes implementaciones de autorización.
  • Permite mantener desacoplada la funcionalidad de autorización pudiendo reemplazarse posteriormente con una implementación distinta.
  • Permite mantener consistencia en la forma que se realiza la autorización, a pesar que se utilicen diferentes implementaciones en diferentes partes del proyecto, o en diferentes proyectos.
  • Es extensible, se pueden incorporar nuevas mecanismos de autorización.
  • Se integra con Policy Injection Application Block y Unity Application Block.
Operatoria

Para realizar la autorización es necesario obtener una instancia del proveedor de autorización, para ello utilizamos el método GetAuthorizationProvider() de la fabrica AuthorizationFactory indicando por nombre que proveedor de queremos utilizar. Esta fabrica crea instancias de los proveedores de autorización con la información contenida en el archivo de configuración.
En el siguiente ejemplo se obtiene una instancia del proveedor “ReglasAdministrativas” y se verifica si el usuario esta autorizado para imprimir.

IPrincipal principal = new GenericPrincipal(new GenericIdentity("username"), new string[]{"Administrador"});

IAuthorizationProvider ruleProvider = AuthorizationFactory.GetAuthorizationProvider("ReglasAdministrativas");

// Determina si el usuario esta autorizado para imprimir.
bool autorizado = ruleProvider.Authorize(principal, "Imprimir"); 

Se llama el método Autorize pasando como parámetros el objeto IPrincial y el nombre de la regla de autorización que se quiere verificar.
El objeto IPrincipal contiene la información del usuario y sus roles. El usuario se representa como una instancia de IIdentity y los roles a los que pertenece se pasan como un array de strings.
El segundo parámetro es un string que representa la regla a validar, concepto diferente para las diferentes implementaciones de autorización.
Para el proveedor AzManAuthorizationProvider que utiliza Autorization Manager (AzMan) el string representa operaciones y tareas.
Para AuthorizationRuleProvider que define las reglas en el archivo de configuración el string representa el nombre de la regla.

Configuración

Utilice la Herramienta de Configuración de Enterprise Library para realizar la configuración de los proveedores de autorización que utilizara.

Para el proveedor que trabaja con AzMan debe indicar los siguientes valores:

  • Aplicación: Nombre de la aplicación.
  • AuditIndentifierPrefix: Prefijo que antecede el identificador de auditoria.
  • Scope: El ambito de autorización.
  • StoreLocation: El lugar donde estan almacenadas las reglas. Puede ser un archivo XML o un lugar de Active Directory o Adam.

En el siguiente ejemplo se define un proveedor de nombre AzMan Provider y los parámetros de configuración son visibles en el panel de la derecha.

Estos parámetros hacen sentido si es interiorizado como funciona AzMan. Un buen articulo introductorio en ingles: Use Role-Based Security in Your Middle Tier .NET Apps with Authorization Manager.

Para configurar el proveedor AuthorizationRuleProvider debe definir reglas que representan las acciones que requieren autorización en su aplicación, y definir que usuarios y grupos tienen autorización para realizar tales acciones.
En el siguiente ejemplo, se define el proveedor “ReglasAdministrativas” con dos reglas “Imprimir” y “Giro Bancario”. Al lado derecho están visible los permisos de acceso para la regla Imprimir, estos se definen usando una expresión. En este caso pueden imprimir los usuarios que pertenecen al grupo Finanzas y el usuario rfederer. Los grupos se simbolizan con R: y los usuarios con I:.

Si hace clic en el botón que esta al lado derecho del campo Expression aparece un formulario que le permitirá definir las expresiones con mayor facilidad.
La sección Expression contiene el cuadro de texto donde debe definir la expresión y abajo hay una serie de botones que le ayudan con la sintaxis. La sección Test Autorization le permite probar la regla de autorización con un usuario, para ello escriba el nombre de usuario en el cuadro de texto Identity y los grupos a los que pertenece en la lista Roles. Luego haga clic en el botón Test y vera si el usuario con esa configuración esta autorizado o no.

Extensiones

Puede implementar un nuevo proveedor de autorización. Para esto debe crear una clase que herede de la clase base AuthorizationProvider y luego reemplazar el método Authorize. Este método contendrá la lógica de autorización, y debe devolver true si el usuario esta autorizado o false si no lo esta.
Para que poder configurar su nuevo proveedor de autorización utilizando el archivo de configuración y la infraestructura de configuración de Enterprise Library debe marcar la clase con el atributo ConfigurationElementType y pasar como parámetro el tipo CustomAuthorizationProviderData esto permitirá que su clase reciba en forma de un diccionario de claves y valores los atributos de configuración. Para recibir estos valores debe agregar un constructor con un parámetro NameValueCollection que contendrá los valores.

[ConfigurationElementType(typeof(CustomAuthorizationProviderData))]
public class MyAuthorizationProvider : AuthorizationProvider
{
  public MyAuthorizationProvider(NameValueCollection configurationItems)
  {
  }
  public override bool Authorize(IPrincipal principal, string context)
  {
    // Implemente la lógica de autorización aquí.
  }
}
Caching de Credenciales

La segunda funcionalidad que incluye Security Application Block es un sistema de caching de identidades. Permite almacenar la identidad del usuario en un cache, de esta forma evitar volver a autenticar el usuario cada vez que realiza una llamada a un servicio durante una sesión.
La primera vez que el usuario se conecta al servicio es autenticado y se registra su información en el cache. El sistema de caching genera un ticket con el cual es posible recobrar la información registrada, este ticket es entregado a la aplicación cliente. En la próxima llamada la aplicación cliente enviá el ticket lo que permite al servidor recobrar los datos del usuario desde el cache evitando una llamada extra al servicio de autenticación.

Hay tres tipos de información que es posible guardar en el cache de identidades. Un objeto IIdentity que contiene la información de identificación usuario. Un objeto IPrincipal que puede contener ademas información de roles a los que pertenece el usuario. Un objeto profile que es en realidad cualquier tipo de objeto con información adicional acerca del usuario como por ejemplo sus preferencias.

Security Application Block utiliza Caching Application Block para mantener el cache de credenciales, este bloque no soporta encriptación de los datos cuando están en memoria, debe considerar esta característica para evaluar si el sistema de caching de credenciales cumple los requerimientos de seguridad de su proyecto.

Operatoria

En el siguiente ejemplo, obtenemos una instancia del proveedor de caching de identidades usando el método GetSecurityCacheProvider de la fabrica SecurityCacheFactory, indicando el nombre del proveedor a usar. Luego, usamos el método SaveIdentity para guardar un objeto IIdentity en el cache y obtener el ticket.

ISecurityCacheProvider secCache = SecurityCacheFactory.GetSecurityCacheProvider("CachingStore");

// Agregar al cache la identidad que representa al usuario obteniendo un token.
IToken token = secCache.SaveIdentity(new GenericIdentity("Username"));

Puede usar en forma análoga los métodos SavePrincipal y SaveProfile para guardar en el cache un objeto IPrincipal y un objeto pro file respectivamente.
En el siguiente ejemplo se utiliza el método GetIdentity para obtener un objeto IIdentity a partir de un token.

ISecurityCacheProvider secCache = SecurityCacheFactory.GetSecurityCacheProvider("CachingStore");

// Obtiene una identidad previamente guardada en el cache usando el ticket.
IIdentity savedIdentity = secCache.GetIdentity(token);

Puede usar análogamente los métodos GetPrincipal y GetProfile.
Finalmente puede remover una identidad del cache usando el método ExpireIdentity.

ISecurityCacheProvider secCache = SecurityCacheFactory.GetSecurityCacheProvider("CachingStore");

// Remueve el objeto IIdendity del cache.
secCache.ExpireIdentity(token);

Puede usar análogamente los métodos GetPrincipal y GetProfile.

Configuración

Utilice la Herramienta de configuración de Enterprise Library para configurar el sistema de caching de identidades.
Puede configurar uno o mas proveedores cada uno de identificados por nombre. El sistema de caching de identidades utiliza Caching Application Block como almacen, por lo tanto debe configurar también este bloque. En el siguiente ejemplo se configura un proveedor llamado CachingStore, que utiliza el cache Cache Manager para mantener la informacion de los usuarios. Ademas debe especificar los siguientes parametros:

  • AbsoluteExpiration: El tiempo en minutos que se mantendra una identidad en el cache.
  • SlidingExpiration: Permite definir un intervalo movil en minutos, si una identidad no es accedida en este intervalo de tiempo entonces es eliminada del cache.

Puede extender el sistema de caching de identidades implementando un nuevo proveedor que utilice otro tipo de almacenamiento para las identidades.

Vea tambien
Links