Como invocar un servicio WSE desde BizTalk Server

Hace unos días participé en un proyecto en el que el último paso de uno de los flujos de negocio consistía en la invocación de un servicio desarrollado con WSE 3.0 desde BizTalk Server. Tanto WSE como WCF soportan los estándares WS-* por lo que la integración entre BizTalk Server y el servicio desarrollado con WSE debería resultar sencilla, pero la realidad es que algunos aspectos de este tipo de integraciones requieren una especial atención.

En este proyecto debíamos tener en cuenta dos cosas, la primera, que el cuerpo de los mensajes que enviásemos desde BizTalk Server debía estar firmado (no encriptado) con un certificado digital y la segunda, que debíamos permitir que los mensajes de respuesta del servicio WSE no implementasen ningún mecanismo de seguridad.

Para cumplir con el primer requisito cambiamos el comportamiento por defecto del adaptador WCF-Custom de BizTalk Server siguiendo tres pasos:

El primer paso consistió en añadir a nuestro puerto de envío la extensión clientCredentials para especificar el certificado X.509 que debíamos utilizar para firmar los mensajes.

En el segundo paso modificamos el nivel de protección de los mensajes a enviar desde BizTalk Server para que estos fueran firmados. En WCF este nivel de protección viene determinado por el valor de la propiedad ProtectionLevel, pero la utilización de esta propiedad desde BizTalk Server presenta un problema: no es accesible desde la consola de administración.  Para resolver este pequeño inconveniente desarrollamos un EndPointBehavior que establecía en tiempo de ejecución los requerimientos de protección requeridos para todos los mensajes salientes:

Una vez registrada esta segunda extensión, también la añadimos a nuestro puerto de envío.

El tercer y último paso consistió en modificar los valores de las propiedades AuthenticationMode y MessageSecurityVersion.  Para tener acceso desde la consola de administración de BizTalk Server a estas dos propiedades fue necesario configurar nuestro puerto de envío con un binding de tipo customBinding. La utilización de este tipo de binding os permitirá obtener un total control sobre la pila de mensajería utilizada por el cliente WCF.

Como el proyecto requería la utilización de certificados X.509 para la autenticación del cliente y el servidor y teniendo en cuenta el algoritmo de cifrado, establecimos el valor de la propiedad AuthenticationMode a MutualCertificateDuplex.

Por último, establecimos el valor de la propiedad MessageSecurityVersion a WSSecurity11-WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10, indicando que la versión de seguridad del mensaje requiere Basic Security Profile, el cual está basado en las especificaciones de seguridad WS-Security 1.1, WS-TrustFebruary2005, WS-SecurityConversation2005, and WSSecurityPolicy1.1.

En este punto del proyecto éramos capaces de enviar mensajes firmados a WSE, ahora solo faltaba aceptar los mensajes de respuesta no seguros del servicio. Para habilitar esta característica de la comunicación entre BizTalk Servcer y el servicio fue suficiente con utilizar el atributo enableUnsecuredResponse del binding.

Para finalizar, solamente os recuerdo que si utilizáis la versión 2009 de BizTalk Server  debéis tener presente que la versión de Windows Communication Foundation incluida en .NET Famework 3.5 SP1 no incluye esta funcionalidad por lo que es necesario instalar el hotfix KB971493 para hacer accesible este atributo desde la consola de administración.