Как подписать SOAP-запрос с WCF - PullRequest
4 голосов
/ 19 февраля 2010

У меня есть сторонний веб-сервис SOAP. Мне нужно позвонить одному из его методов. Запрос должен быть подписан. Как я могу подписать запрос?

Ответы [ 3 ]

6 голосов
/ 19 февраля 2010

Я предполагаю, что подписывая, вы имеете в виду, что вы подписываете сообщение с помощью сертификата, установленного на стороне клиента.

Сделать это относительно легко в WCF. Предполагая, что вы используете wsHttpBinding в элементе безопасности , вы должны установить режим на SecurityMode.Message . Вы также должны установить clientCredentialType элемента сообщения в MessageCredentialType.Certificate .

Затем вам потребуется настроить поведение конечной точки и настроить элемент clientCertificate (который является дочерним элементом элемента clientCredentials ), чтобы указать, где хранится сертификат клиента.

Даже если вы не используете wsHttpBinding, конфигурация практически одинакова для большинства других привязок, когда вы хотите использовать сертификат клиента для обеспечения безопасности на уровне сообщений.

Если вы выполняете вызов по HTTPS, обратите внимание, что вам нужно установить атрибут режима в элементе безопасности равным Mode.TransportWithMessageCredential.

1 голос
/ 19 февраля 2010

Ниже задан вопрос об использовании WCF для использования сервиса Amazon SOAP, который требует подписи.Я думаю, что ответ дает отличный пример, который может помочь в вашей ситуации.

Как подписать запрос веб-службы Amazon в .NET с SOAP и без WSE

Редактировать: было очевидно, что возникла путаница относительно ссылки на этот другой вопрос StackOverflow.Я хотел бы отметить самый высокий голос за выбранный ответ.Это определенно решение WCF.Вы заметите класс SigningMessageInspector, который наследуется от IClientMessageInspector (интерфейс WCF).Я думаю, что этот раздел может вам помочь.

0 голосов
/ 27 марта 2018

Опираясь на очень полезный ответ @casperOne, я получил следующую конфигурацию:

<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
    </startup>

  <system.serviceModel>
    <bindings>    
      <wsHttpBinding>
        <binding>
          <security mode="TransportWithMessageCredential">
            <message clientCredentialType="Certificate" />
          </security>          
        </binding>               
      </wsHttpBinding>
    </bindings>
    <client>
      <!-- specifies the endpoint to use when calling the service -->
      <endpoint address="https://SomeEndPointUrl/v1"
          binding="wsHttpBinding"
          behaviorConfiguration="SigningCallback"
          contract="ServiceReference1.EboxMessagePortType" name="MyBindingConfig">
      </endpoint>
    </client>

    <behaviors>
      <endpointBehaviors>
        <behavior name="SigningCallback">
          <clientCredentials>
            <clientCertificate findValue="*somecertsubjectname*"
                storeLocation="LocalMachine"
                storeName="TrustedPublisher"
                x509FindType="FindBySubjectName"
                />
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>        
  </system.serviceModel>
</configuration>

Это для мыльного клиента через https

...