реализация Ws-безопасности в прокси WCF - PullRequest
4 голосов
/ 31 мая 2010

Я импортировал wsdl на основе оси в проект VS 2008 в качестве справочной службы.

Мне нужно иметь возможность передавать детали безопасности, такие как имя пользователя / пароль и одноразовые значения, для вызова службы на основе оси.

Я попытался сделать это для WSE, который, как я понимаю, мир ненавидит (без проблем)

У меня очень мало опыта работы с WCF, но я уже работал над тем, как физически вызвать конечную точку, благодаря SO, но не знаю, как настроить SoapHeaders, как показано на схеме ниже:

<S:Envelope 
  xmlns:S="http://www.w3.org/2001/12/soap-envelope"
  xmlns:ws="http://schemas.xmlsoap.org/ws/2002/04/secext">
    <S:Header>
        <ws:Security>
            <ws:UsernameToken>
                <ws:Username>aarons</ws:Username>
                <ws:Password>snoraa</ws:Password>
            </ws:UsernameToken>
        </wsse:Security>
        •••
    </S:Header>
    •••
</S:Envelope>

Любая помощь высоко ценится

Спасибо, Марк

Ответы [ 2 ]

4 голосов
/ 31 мая 2010

Для вызова таких сервисов вы обычно будете использовать basicHttpBinding (это SOAP 1.1 без реализаций WS- *) или затем wsHttpBinding (SOAP 1.2, с реализациями WS- *).

Основной проблемой будет правильное определение всех параметров безопасности. У меня есть аналогичный веб-сервис (на основе Java), который мне нужно вызвать - вот мои настройки и код:

приложение. / Web.config

<system.serviceModel>
   <bindings>
      <basicHttpBinding>
         <binding name="SoapWithAuth" useDefaultWebProxy="false">
            <security mode="TransportCredentialOnly">
              <transport clientCredentialType="Basic" proxyCredentialType="None" realm="" />
            </security>
         </binding>
      </basicHttpBinding>
   </bindings>
   <client>
    <endpoint name="SoapWithAuth"
                  address="http://yourserver:port/YourService"
                  binding="basicHttpBinding" 
                  bindingConfiguration="SoapWithAuth"
                  contract="IYourService" />
   </client>
</system.serviceModel>

и затем в коде вашего клиента при вызове службы вам понадобится следующий фрагмент кода:

IYourServiceClient client = new IYourServiceClient();

client.ClientCredentials.UserName.UserName = "username";
client.ClientCredentials.UserName.Password = "top-secret"; 

Помогает ли это вообще?

0 голосов
/ 22 июля 2010

Клиентский прокси WCF не поддерживает опцию паролей. Единственный способ сделать это - создать UsernameToken самостоятельно, а затем вставить его в заголовки SOAP перед отправкой сообщения.

У меня была похожая проблема, описанная здесь , которой должно быть достаточно, чтобы помочь вам решить ту же проблему.

Я закончил тем, что использовал старую библиотеку WSE3.0 для UsernameToken вместо того, чтобы сам кодировать алгоритм хеширования, а затем использовал собственное поведение для изменения заголовков SOAP.

...