Saltar al contenido

Eliminar la etiqueta TimeStamp de la cabecera ws-security en WCF

En la comunicación entre servicios web, con WS-Security, puede suceder que un servicio rechace la petición porque en la cabecera vaya la etiqueta TimeStamp. Si estamos desarrollado con Windows Communication Fundation (WCF) hemos de saber que es el propio framework es quien la introduce, por defecto, al usar alguno de los bindings predefinidos. ¿Hay manera de eliminar? Sí, veamos cómo.

Imaginemos que tenemos un cliente web que tiene configurado un basicHttpBinding de esta manera:

<basicHttpBinding>
<binding name="scspwsSoap11">
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" />
</security>
</binding>
</basicHttpBinding>

Si examinamos una  petición que envía al servicio, vamos algo así:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Header>
<o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<u:Timestamp u:Id="_0">
<u:Created>2020-02-13T10:11:56.317Z</u:Created>
<u:Expires>2020-02-13T10:16:56.317Z</u:Expires>
</u:Timestamp>
<o:UsernameToken u:Id="uuid-ca61122b-2e50-455a-ba4e-88a9c41522e2-1">
<o:Username>usuario</o:Username>
<o:Password Type="contraseñacontraseñacontraseñacontraseñacontraseñahttp://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">contraseña</o:Password>
</o:UsernameToken>
</o:Security>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- contenido de la petición -->
</s:Body>
</s:Envelope>

y que provoca un error porque el servidor no consigue validar al usuario. Al comparar la petición con otra correcta, vemos que el problema está en que la petición incluye la etiqueta TimeStamp. Buscamos en internet y encontramos una respuesta que nos orienta hacia la resolución del problema. Siguiendo lo que en ella indican, cambiamos a un customBinding que permite eliminar el TimeStamp:

<customBinding>
<binding name="CustomBindingName">
<security authenticationMode="UserNameOverTransport" includeTimestamp="false">
<secureConversationBootstrap includeTimestamp="false" />
</security>
<textMessageEncoding messageVersion="Soap11" />
<httpsTransport useDefaultWebProxy="false" requireClientCertificate="false" />
</binding>
</customBinding>

Con este cambio, el servicio responde correctamente y procesa la petición.

Un comentario

  1. Hola,
    acabo de ver que si hacemos lo propuesto, establecer IncludeTimestamp a false, podemos estar perdiendo seguridad en la comunicación cliente-servidor. En la documentación https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/best-practices-for-security-in-wcf#set-securitybindingelementincludetimestamp-to-true-on-custom-bindings dicen:

    si hemos fijado IncludeTimestamp a false, y el cliente usa un token simétrico basado en clave, como un certificado X509, el mensaje no será firmado.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos Ver más

  • Responsable: Jorge Hoya.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio. El Titular ha contratado los servicios de alojamiento web a OVH que actúa como encargado de tratamiento.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Esta web utiliza cookies, puedes lees sobre ellas en la política de cookies    Ver política de cookies
Privacidad