SOAP WCF 将 Signature 和 BinarySecurityToken 添加到标头

Posted

技术标签:

【中文标题】SOAP WCF 将 Signature 和 BinarySecurityToken 添加到标头【英文标题】:SOAP WCF add Signature and BinarySecurityToken to header 【发布时间】:2020-08-29 05:19:17 【问题描述】:

我需要更多东西,签名必须在 Header 标记内的 Security 标记内,并带有 BinarySecurityToken 元素

就像:

<soapenv:Header> <!-- extrac of the example file -->
  <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu=" http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="X509-D53CCD6983E4CE0BD7142791021078262">
        MIIDbDgg4iF74cqiF6NcnzBnD9qA2MB6hSo38e0RISilEFSzWikDqBtOjgm7ux9fdeHojDm4uvhsSfbEyGmGTAQRzg9yIiD3ovjOzuZsf+I3HWS9F6xl6sb2+wvYXD4DFk/OD+N7UszGsoWFZg
    </wsse:BinarySecurityToken>
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
          .....
    </ds:Signature>

我可以像这样以编程方式直接从客户端证书填充 xml 元素:

var cert = new X509Certificate2(ClientCertificateFilePath, ClientCertificatePassword);
        var export = cert.Export(X509ContentType.Cert, ClientCertificatePassword);
        var base64 = Convert.ToBase64String(export);

问题是如何在header中添加Signature和BinarySecurityToken?

【问题讨论】:

见下文:***.com/questions/46722997/… 【参考方案1】:

手动编写 SOAP 信封来调用服务可能是一种选择。 这里有一些关于如何添加 SOAP 标头的讨论。What is the Java Apache CXF equivalent of C# WCF AddressHeader? 这通常是因为服务器端的 web 服务不是 WCF,因此我们可能无法通过 WCF 调用服务。 在我看来,上述 SOAP 信封格式决定了 WCF 使用的绑定的通道形状,这可能与使用证书对客户端进行身份验证的 WCF 服务兼容。

BasicHttpBinding binding = new BasicHttpBinding();
            binding.Security.Mode = BasicHttpSecurityMode.TransportWithMessageCredential;
            binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;

当服务器使用证书对客户端进行身份验证时,客户端使用相同的绑定类型并向服务器提供证书,并在 SOAP 信封中附加证书的签名。 下面是 Fiddler 捕获的与服务器端通信时的 Http 流量。他们的肥皂信封很相似。 有关使用证书验证客户端的更多信息,请参阅以下链接。https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/message-security-with-a-certificate-clienthttps://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/transport-security-with-certificate-authentication 如果有什么可以帮助的,请随时告诉我。

【讨论】:

以上是关于SOAP WCF 将 Signature 和 BinarySecurityToken 添加到标头的主要内容,如果未能解决你的问题,请参考以下文章

将 WCF SOAP 和 WCF REST 服务托管为 Azure 应用服务

WCF IErrorHandler 将 FaultException 返回给 SOAP,将 WebHttpException 返回给 POX 和 Json 端点

将授权标头添加到 WCF 基架 SOAP Web 服务

WCF SOAP

如何同时使用 SOAP WCF 服务和 REST API

如果我使用 wcf,如何将 <s:Envelope 更改为 <SOAP-ENV:Envelope?