WSTrustChannelFactory y WSTrustChannel

Si ya está familiarizado con Windows Communication Foundation (WCF), sabrá que un cliente de WCF ya reconoce la federación. Configurando un cliente de WCF con un WSFederationHttpBinding o un enlace personalizado similar, puede habilitar la autenticación federada en un servicio.

WCF obtiene el token que el security token service (STS) emite en segundo plano y utiliza este token para autenticar al servicio. La limitación principal de este enfoque es que no hay visibilidad en las comunicaciones del cliente con el servidor. WCF genera automáticamente el token de seguridad de solicitud (RST) para el STS basándose en los parámetros de token emitidos en el enlace. Esto significa que el cliente no puede variar los parámetros de RST para cada solicitud, inspeccionar la respuesta de token de seguridad de solicitud (RSTR) para obtener información, por ejemplo mostrar notificaciones, ni almacenar en memoria caché el token para un uso futuro.

Actualmente, el cliente de WCF es adecuado para escenarios de federación básicos. Sin embargo, uno de los escenarios principales que admite Windows® Identity Foundation (WIF) requiere control sobre el RST en un nivel que WCF no permite con facilidad. Por consiguiente, WIF agrega características que ofrecen más control sobre la comunicación con el STS.

WIF admite los siguientes escenarios de federación:

  1. Utilizar un cliente de WCF sin ninguna dependencia de WIF para autenticar en un servicio federado

  2. Habilitar WIF en un cliente de WCF para insertar un elemento OnBehalfOf o ActAs en el RST para el STS

  3. Utilizar WIF en solitario para obtener un token del STS y, a continuación, permitir que un cliente de WCF autentique con este token

El primer escenario se explica por sí mismo: los clientes de WCF existentes continuarán trabajando con usuarios de confianza y STS de WIF. Este tema explica los dos escenarios restantes.

Mejorar un cliente de WCF existente con ActAs / OnBehalfOf

En un escenario de delegación de identidad típico, un cliente llama a un servicio de nivel intermedio, el cual, a continuación, llama a un servicio back-end. El servicio de nivel intermedio actúa como, o en nombre de, el cliente. (Para obtener más información, consulte la sección “ActAs y OnBehalfOf en Preguntas más frecuentes). Esta información se transmite a un emisor de WS-Trust utilizando los elementos de token OnBehalfOf y ActAs en el RST.

WCF expone un punto de extensibilidad en el enlace que permite agregar elementos XML arbitrarios al RST. Sin embargo, como el punto de extensibilidad está ligado al enlace, los escenario que requieren que el contenido del RST varíe en cada llamada deben volver a crear el cliente para cada llamada, lo cual disminuye el rendimiento. WIF utiliza los métodos de extensión de la clase ChannelFactory para permitir que los desarrolladores adjunten cualquier token que se obtenga fuera de banda al RST. En el siguiente ejemplo de código se muestra cómo tomar un token que representa al cliente (por ejemplo un token X.509, de nombre de usuario o del lenguaje de marcado de aserción de seguridad (SAML)) y adjuntarlo al RST que se envía al emisor.

IHelloService serviceChannel = channelFactory.CreateChannelActingAs<IHelloService>( clientSamlToken ); serviceChannel.Hello(“Hi!”);

WIF proporciona los siguientes beneficios:

  • El RST se puede modificar para cada canal; por consiguiente, los servicios de nivel intermedio no tienen que volver a crear el generador de canales para cada cliente, lo cual mejora el rendimiento.

  • Esto funciona con clientes de WCF existentes, lo cual posibilita una ruta de acceso de actualización fácil para los servicios de nivel intermedio de WCF existentes que desean habilitar la semántica de delegación de identidad.

Sin embargo, no hay todavía visibilidad en la comunicación del cliente con el STS. Examinaremos esto en el tercer escenario.

Comunicar directamente con un emisor y utilizar el token emitido para autenticar

Para algunos escenarios avanzados, mejorar un cliente WCF no es suficiente. Los desarrolladores que habitualmente solo utilizan WCF usan contratos Message In / Message Out y realizan manualmente el análisis en el lado del cliente de la respuesta del emisor.

WIF introduce las clases WSTrustChannel y WSTrustChannelFactory para permitir que el cliente comunique directamente con un emisor de WS-Trust. Las clases WSTrustChannel y WSTrustChannelFactory habilitan objetos RSTR y RST fuertemente tipados para que fluyan entre el cliente y el emisor, como se muestra en el siguiente ejemplo de código.

WSTrustChannelFactory trustChannelFactory = new WSTrustChannelFactory( stsBinding, stsAddress ); WSTrustChannel channel = (WSTrustChannel) trustChannelFactory.CreateChannel(); RequestSecurityToken rst = new RequestSecurityToken(RequestTypes.Issue); rst.AppliesTo = new EndpointAddress(serviceAddress); RequestSecurityTokenResponse rstr = null; SecurityToken token = channel.Issue(rst, out rstr);

Tenga en cuenta que el parámetro out en el método Issue permite el acceso al RSTR para la inspección en el lado del cliente.

Hasta ahora, solo hemos visto cómo obtener un token. El token que el objeto WSTrustChannel devuelve es un GenericXmlSecurityToken que contiene toda la información necesaria para la autenticación en un usuario de confianza. En el siguiente ejemplo de código se muestra cómo utilizar este token.

IHelloService serviceChannel = channelFactory.CreateChannelWithIssuedToken<IHelloService>( token ); serviceChannel.Hello(“Hi!”);

El método de extensión CreateChannelWithIssuedToken en el objeto ChannelFactory le indica a WIF que ha obtenido un token fuera de banda, y que debería detener la llamada normal de WCF al emisor y en su lugar utilizan el token obtenido para autenticar en el usuario de confianza. Esto tiene las siguientes ventajas:

  • Proporciona un control completo sobre el proceso de emisión de tokens.

  • Admite escenarios ActAs / OnBehalfOf estableciendo directamente estas propiedades en el RST saliente.

  • Permite tomar decisiones de confianza dinámicas en el lado del cliente basadas en el contenido del RSTR.

  • Permite almacenar en memoria caché y reutilizar el token devuelto por el método Issue.

  • WSTrustChannelFactory y WSTrustChannel permiten el control del almacenamiento en memoria caché de canales, de errores y de semántica de recuperación según las prácticas recomendadas de WCF.

Para obtener más información, vea el ejemplo de Extensibilidad/WSTrustChannel en la ubicación en la que instaló WIF.