Compartilhar via


WCF and Beyond: Behaviors, Inspectors, Authorization, ...

WCF es una Framework de comunicaciones que permite construir servicios basados en Arquitecturas SOA con mucha facilidad y con la posiblidad de exponer dichos servicios de distintas maneras. Estas diferentes maneras incluyen protocolos de comunicación (Bindings), seguridad (Behaviors y Authorization Policies), Manipulación del Mensaje (Encriptado, Firmas, etc).

La arquitectura de WCF podemos dividirla en varias partes: Interfaz de Servicio y Contratos, Implementación, Comunicaciones, Mensajería, Seguridad y Canales (El porque distingo entre Comunicaciones y Canales lo veremos más adelante).

La interfaz de servicio y los contratos es donde definimos el modelo de negocio que queremos definir. Estas piezas en WCF son bastante sencillas de contruir puesto que la mayor parte de la integración con WCF se realiza mediante atributos. En el caso de la implementación, gracias a este modelo podemos utilizar una misma interfaz de servicio y los mismos contratos para diferentes implementaciones de servicio. Esto facilita el aplicar Patrones de Diseño como Proxy o Strategy para modelar comportamientos en Runtime (esto lo dejo para siguientes posts para no mezclar).

En cuanto a las comunicaciones, en WCF los denominamos Bindings. Un Binding es el responsable de comunicarse con un Endpoint mediante un Address, o lo que es lo mismo un Binding procesa un mensaje y lo envia a una dirección usando un protocolo determinado. El modelo de Bindings es el que facilita que el servicio pueda comunicarse utilizando múltiples protocolos.

Los componentes de Inspección (Inspectors) proporcionan la posibilidad de manipular el mensaje en el origen y en el destino para incluir funcionalidad (normalmente mediante la inclusión de cabeceras). Mediante un Inspector se realizan acciones como incluir cabeceras de Autenticación, de control de sesion, de control de ambiente transaccional.

A la hora de crear un Inspector tenemos la opción de hacerlo en el emisor implementando de la Interfaz IClientMessageInspector y en la parte receptora podemos desarrollar un Inspector haciendo uso de IDispatchMessageInspector.

 public interface IClientMessageInspector
{
     void AfterReceiveReply(ref Message reply, object correlationState);
     object BeforeSendRequest(ref Message request, IClientChannel channel);
}
 public interface IDispatchMessageInspector
{
     object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext);
     void BeforeSendReply(ref Message reply, object correlationState);
}

La piedra angular de los inspectores es la clase Message que nos permite acceder al contenido del mensaje (Body) o a las cabeceras. En WCF el mensaje siempre esta conformado en formato XML independientemente del protocolo a utilizar. Esto se debe a que WCF utiliza SOAP como protocolo de aplicación, lo que facilita disponer de un modelo homogeneo en la construcción y tratamiento de los mensajes 

Extensión de WCF con comportamientos personalizados

La forma de aplicar un inspector de mensajes es haciendo uso de los componentes tipo Behavior de WCF, y para ello disponemos de la interfaz IEndpointBehavior que nos permite aplicarlo a cada endpoint que definamos por separado (tanto en el llamante como en el receptor), y por otra parte podemos hacer uso de IServiceBehavior, cuando queremos asociar el comportamiento al servicio y no a sus podibles endpoint.

En cuanto a los modelos de Autenticación y Autorización que podemos aplicar en WCF, lo primero que debemos tener en cuenta es que aplicar uno no implica obligatoriamente aplicar el otro. El módulo de Autenticación nos permite adaptar nuestros servicios al modelo de seguridad que hayamos escogido. Actualmente WCF nos permite disponer fácilmente de un modelo basado en UserName and Password o en Certificados. En cuanto a los módulos de Autorización, nos permite determinar el nivel de acceso de un usuario en función de un Token de usuario (siendo muy útil en escenarios de SSO Custom donde la Autenticación se realiza una vez y lo que manejamos en nuestros mensajes es el Token de usuario).

A continuación incluyo una serie de ejemplos de creación y uso de módulos de Autenticación y Autorización en escenarios Custom:

Seguridad Personalizada en WCF (en Ingles)

Autenticación Personalizada con WCF (en Ingles)

Autenticación, Autorización e Impersonación Personalizada en WCF (en Ingles)

Service Station: authorization in WCF

Como se puede ver WCF es una tecnología muy amplia que facilita la creación de servicios de una manera muy sencilla pero a la vez provee de un modelo muy extensible y desacoplado que nos permite adaptarnos a distintas necesidades. La extensibilidad de WCF es un tema muy extenso y que puede dar para tratarlo muy en profundidad. En cualquier caso, mi recomendación es que gracias a las posibilidades de Visual Studio, todos los servicios que creemos con WCF esten acompañados de sus correspondientes pruebas que faciliten verificar su correcto comportamiento y de esta manera poder extender el modelo de servicios que hayamos creado con la certeza de saber que todo sigue funcionando correctamente con dichas pruebass antes de pasar a un entorno productivo.

WCF_Client.jpg