C# 如何使用WCF签署SOAP请求

C# 如何使用WCF签署SOAP请求,c#,.net,wcf,.net-3.5,C#,.net,Wcf,.net 3.5,我有一个第三方SOAP web服务。我需要调用它的一个方法。请求需要签名。如何对请求进行签名?我认为签名意味着您使用安装在客户端的证书对消息进行签名 在WCF中这样做相对容易。假设您正在中使用,则必须将模式设置为。您还必须将设置为 然后,您必须设置端点行为并配置(它是的子项)以指示客户端证书存储的位置 即使您不使用wsHttpBinding,当您希望使用客户端证书来提供消息级安全性时,大多数其他绑定的配置也几乎相同 如果您是通过HTTPS进行呼叫,请注意,您必须将安全元素上的mode属性设置为m

我有一个第三方SOAP web服务。我需要调用它的一个方法。请求需要签名。如何对请求进行签名?

我认为签名意味着您使用安装在客户端的证书对消息进行签名

在WCF中这样做相对容易。假设您正在中使用,则必须将模式设置为。您还必须将设置为

然后,您必须设置端点行为并配置(它是的子项)以指示客户端证书存储的位置

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


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

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


编辑:很明显,关于这个问题的链接有些混乱。我想指出投票率最高的答案。这绝对是一个WCF解决方案。您将注意到从IClientMessageInspector(一个WCF接口)继承的类SigningMessageInspector。我认为本节可能会对您有所帮助。

基于@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上的soap客户端来说也不适用于WCF。@casperOne-根据Tim的链接,一个大的答案是“我最终更新了代码以使用WCF…”。为什么不使用WCF?@Tim C:在你发布链接时,唯一的答案是:它肯定没有WCF解决方案。你是对的,我说的是用发出请求的机器上的证书对请求进行签名。我使用的是basicHttpBinding,因为默认情况下,该实用程序会生成它,我将它切换到wsHttpBinding,只是在web.config中替换了它。当我发出请求时,我得到了一个错误:“请求被中止:无法创建SSL/TLS安全通道。”@Bell先生:您应该能够使用相同的属性在basicHttpBinding上设置安全模式。当我查看正在发出的原始请求(来自跟踪文件)时,它没有提到任何关于签名的内容