servicio paso mundo hola crear configurar wcf soap wcf-security ws-security basichttpbinding

wcf - paso - endpoint web config



Configuración del cliente WCF para el servicio SOAP 1.1 de terceros con credenciales de usuario de texto sin formato a través de SSL (1)

Da la casualidad de que Rick Strahl tenía el mismo problema. Aquí está el enlace a su publicación de blog que describe y soluciona el problema.

Problema:

El problema es que WCF espera un encabezado de Soap TimeStamp en la respuesta. Si miras la respuesta de salida y los encabezados de Soap, verás que hay una marca de tiempo allí. Se espera que la marca de tiempo sea devuelta en la respuesta de Jabón de retorno. Tenga en cuenta que esto no es un requisito de WS-Security, por lo que WCF está haciendo algo ''especial'' aquí que está en efecto rompiendo esta llamada de servicio.

Solución:

BindingElementCollection elements = client.Endpoint.Binding.CreateBindingElements(); elements.Find<SecurityBindingElement>().IncludeTimestamp = false; client.Endpoint.Binding = new CustomBinding(elements);

El código anterior modifica la configuración de enlace al eliminar explícitamente la marca de tiempo de la llamada saliente, lo que elimina el requisito de que el servidor la devuelva. Y esto hace feliz a WCF y la llamada se cumple.

Estoy intentando conectarme a un servicio SOAP 1.1 de terceros que requiere seguridad SSL y credenciales de nombre de usuario / contraseña. Un ejemplo de lo que se espera es:

<soapenv:Header> <wsse:Security> <wsse:UsernameToken> <wsse:Username>username</wsse:Username> <wsse:Password>password</wsse:Password> </wsse:UsernameToken> </wsse:Security> </soapenv:Header>

La configuración de mi cliente es la siguiente:

<system.serviceModel> <bindings> <basicHttpBinding> <binding name="thirdpartyservicebindingconfig"> <security mode="TransportWithMessageCredential"> <message clientCredentialType="UserName" algorithmSuite="Default" /> </security> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="https://..." binding="basicHttpBinding" bindingConfiguration="thirdpartyservicebindingconfig" contract="thirdpartyservicecontract" name="thirdpartyserviceendpoint" /> </client> </system.serviceModel>

El código de cliente de servicio es:

var client = new thirdpartyservicecontractclient(); client.ClientCredentials.UserName.UserName = "username"; client.ClientCredentials.UserName.Password = "password"; var result = client.DoSomething();

Recibo el siguiente mensaje de excepción de error:

El procesador de seguridad no pudo encontrar un encabezado de seguridad en el mensaje. Esto puede deberse a que el mensaje es un error no asegurado o porque existe una falta de correspondencia vinculante entre las partes que se comunican. Esto puede ocurrir si el servicio está configurado para seguridad y el cliente no está usando seguridad.

EDITAR:
Si reconfiguro el modo de seguridad a "Transporte":
<security mode="TransportWithMessageCredential">
Recibo un error del servicio de terceros:

com.sun.xml.wss.XWSSecurityException: el mensaje no se ajusta a la política configurada [AuthenticationTokenPolicy (S)]: no se encontró ningún encabezado de seguridad; La excepción anidada es com.sun.xml.wss.XWSSecurityException: com.sun.xml.wss.XWSSecurityException: El mensaje no cumple con la política configurada [AuthenticationTokenPolicy (S)]: no se encontró ningún encabezado de seguridad.

¿Cómo puedo configurar mi cliente para conectarme a este servicio?

  • Seguridad WS utilizando contraseñas de texto plano sobre SSL