FIX: Wcf Client security header MustUnderstand=0

wcf-logo

Un poco de introducción a WSE

Los servicios Web ofrecen comunicación con diferentes sistemas operativos y plataformas. Para conseguir este objetivo, se basan en una familia de especificaciones de protocolos industriales para los servicios Web, que generalmente se denomina WS-*.

WSE ofrece ventajas como seguridad de extremo a extremo en el nivel de los mensajes, enrutamiento basado en contenidos y directivas que aprovechan las especificaciones WS-Security, WS-Addressing y WS-Policy  y proporciona implementaciones de muchas de estas especificaciones para aquellos programadores que deseen ser los primeros en utilizar la tecnología de última generación para los servicios Web.

Web Services Enhancements (WSE) 3.0 for Microsoft .NET

WSE, que se puede descargar gratuitamente, es totalmente compatible y amplía la compatibilidad actual de los servicios Web de .NET Framework. Aunque no se ofrecen garantías de que la versión 2.0 vaya a ser compatible en cuanto a la conexión y el modelo de objeto con las principales futuras versiones de WSE 3.0, la compatibilidad de lado a lado está garantizada.

Como cambiar header MustUnderstand=”0″

Recientemente, hemos tenido problemas para conectarnos con WebService hecho con Java, JAX-WS y Axis2 por temas de Seguridad basado en el estandar OASIS (http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd), y esta es la solución adoptada para enviar las cabeceras de seguridad.

En este artículo, explican detalladamente como solucionarlo en Java pero no con NET: http://wso2.com/library/tutorials/understand-famous-did-not-understand-mustunderstand-header-s-error/

Este es la definición y formato de la cabecera que debemos enviar al servidor.

<soapenv:Header>
<wsse:Security …>
   <wsse:UsernameToken>
   <wsse:Username>…</wsse:Username>
   <wsse:Password>…</wsse:Password>
   </wsse:UsernameToken>
   </wsse:Security>
</soapenv:Header>

Solucion .NET

La solucion en NET, es simple, añadir al app.config o web.config lo siguiente:

En customBinding o httpBasicBindind:
  <customBinding>
     <binding name="CustomBindingExportacion" >          si existen  quitar marcas <security> y <mtomMessageEncoding>
          <!--<security authenticationMode="UserNameOverTransport" includeTimestamp="False"/>
          <!--<mtomMessageEncoding messageVersion="Soap11" />-->           poner esto para Soap11:
          <textMessageEncoding messageVersion="Soap11" /> poner esto para https si es necesario:
          <httpsTransport />
        </binding>
      </customBinding>
 En client – endpoint: ponemos cabecera de seguridad a mano indicando el user y password
    <client>
      <endpoint address="https://servidor:443/services/NombreWebService"
                binding="customBinding"
                bindingConfiguration="CustomBindingExportacion"
                contract="contratoImplWS"
                name="nombreEndPoint">

     <headers>
          <wsse:Security s:mustUnderstand="0" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
             <wsse:UsernameToken>
               <wsse:Username>usuario</wsse:Username>
               <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password-plano-o-encriptrado-md5-sha1</wsse:Password>
             </wsse:UsernameToken>
          </wsse:Security>
        </headers>

      </endpoint>
    </client>
Volver a compilar y probarlo… ahora deberia funcionar correctamente.
El error  mustUnderstand=”1″ anterior:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
    <Misunderstood qname="o:Security" xmlns="http://www.w3.org/2002/06/soap-faults" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" />
</soapenv:Header>
<soapenv:Body>
    <soapenv:Fault xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
        <faultcode>soapenv:MustUnderstand</faultcode>
        <faultstring>WSWS3173E: Error: Did not understand &quot;MustUnderstand&quot; header(s):{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security</faultstring>
    </soapenv:Fault>
</soapenv:Body>
queda solucionado!!

 

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s