如何使用WCF签署SOAP请求

时间:2010-02-18 21:22:26

标签: c# .net wcf .net-3.5

我有第三方SOAP Web服务。我需要调用它的一个方法。请求需要签名。我该如何签署请求?

3 个答案:

答案 0 :(得分:6)

我认为通过签名意味着您使用安装在客户端的证书对邮件进行签名。

在WCF中这样做相对容易。假设您使用wsHttpBinding中的security element,则必须将模式设置为SecurityMode.Message。您还必须将clientCredentialType of the message element设置为MessageCredentialType.Certificate

然后,您必须设置端点行为并配置clientCertificate elementclientCredentials element的子级)以指示客户端证书的存储位置。

即使您没有使用wsHttpBinding,当您希望使用客户端证书提供消息级安全性时,大多数其他绑定的配置也基本相同。

如果您通过HTTPS进行呼叫,请注意您必须将security元素的mode属性设置为Mode.TransportWithMessageCredential。

答案 1 :(得分:1)

以下是有关使用WCF使用需要签名的Amazon SOAP服务的问题。我认为答案给出了一个很好的例子,可能对你的情况有所帮助。

How to sign an Amazon web service request in .NET with SOAP and without WSE

编辑:对于其他StackOverflow问题的链接显然存在一些混淆。我想指出投票选出的最高答案。它绝对是WCF解决方案。您将注意到继承自IClientMessageInspector(WCF接口)的类SigningMessageInspector。我认为本节可能会对您有所帮助。

答案 2 :(得分:0)

在@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的肥皂客户端