Проблемы с WCF и SOAP WS-Security Имя пользователя в виде простого текста (без SSL)
Нам нужно использовать веб-службу SOAP 1.1, разработанную с использованием Java, из приложения C # /. Net 4.0. У нас нет доступа к программированию сервиса или серверу, на котором он находится. Служба предоставляется через соединение без SSL и требует WS-Security, Username / PasswordText.
Используя SoapUI (http://soapui.org/), мы можем использовать веб-сервис, просто создав проект, указав его на WSDL и настроив простую конфигурацию WS-Security Имя пользователя / PasswordText.
Проблема в том, что мы не можем использовать веб-сервис с использованием WCF. После некоторых исследований мы нашли информацию, которая позволяет нам полагать, что проблема может заключаться в несовместимости между SOAP 1.1, WS-Security и wsHttpBinding. Используемый код C # следующий:
//The WSService.ServiceClient class is generated by the Service Reference
var client = new WSService.ServiceClient();
client.ClientCredentials.UserName.UserName = "Username";
client.ClientCredentials.UserName.Password = "Password";
var response = client.MethodToBeConsumed();
Созданная привязка выглядит следующим образом:
<binding name="GeneratedBinding" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
Привязка, созданная ссылкой на службу, представляет собой basicHttpBinding. Мы понимаем, что нам нужно использовать wsHttpBinding для WS-Security (SOAP 1.2), но, поскольку сервис использует SOAP 1.1, эти два вида несовместимы.
Правильное сообщение запроса должно быть (как сгенерировано SOAPUI):
POST http://server:port/Service HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: ""
Authorization: Basic ENCRYPTEDPASSWORD
User-Agent: Jakarta Commons-HttpClient/3.1
Host: server:port
Content-Length: 324
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:service.version.details">
<soapenv:Header/>
<soapenv:Body>
<urn:methodName>
<arg0>1</arg0>
<arg1>1</arg1>
</urn:method>
</soapenv:Body>
</soapenv:Envelope>
Неужели нет способа добиться этого с помощью WCF? Можно ли это решить с помощью customBinding? Является ли наш единственный доступный способ создания заголовков / сообщений вручную и анализа ответов? Нужно ли убивать разработчика веб-службы для использования WS-Security с SOAP 1.1 через соединение без SSL?