Проблемы с WCF и SOAP WS-Security Имя пользователя в виде простого текста (без SSL) - PullRequest
3 голосов
/ 28 марта 2012

Нам необходимо использовать веб-службу 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>

ПривязкаСсылка на службу, созданная с помощью Service Reference, представляет собой 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?

Ответы [ 2 ]

3 голосов
/ 12 апреля 2012

Окончательное решение состояло в том, чтобы вставить заголовок Authorization в запросы, как описано в следующем сообщении:

http://social.msdn.microsoft.com/Forums/is/wcf/thread/4f8ab001-dafa-4347-bc41-95255ecc9230

Это не требовало никаких изменений для сгенерированного клиента или привязок.

0 голосов
/ 28 марта 2012

Посмотрите, поможет ли это вам (WSHttpBinding использовал, но велел делать запросы, совместимые с SOAP 1.1):

Поддерживает ли WCF WS-Security с SOAP 1.1?

...