如何将 WCF 配置为仅对时间戳标头进行签名



我正在尝试配置我的WCF客户端以创建一个包含WS-Addressing,WS-Security和TLS的SOAP 1.1请求。

安全

要求是消息包含用户名令牌、时间戳,并且时间戳使用包含的二进制安全令牌进行签名。

我已使用以下链接中的示例来创建我的 WCF 客户端绑定。 我稍微修改了示例(见下文),以便将HTTPS用作传输机制,并且MessageSecurity基于UsernameOverTransport。

            HttpsTransportBindingElement httpsTransport = new HttpsTransportBindingElement();            
        // the message security binding element will be configured to require 2 tokens:
        // 1) A username-password encrypted with the service token
        // 2) A client certificate used to sign the message
        // Instantiate a binding element that will require the username/password token in the message (encrypted with the server cert)
        TransportSecurityBindingElement messageSecurity = SecurityBindingElement.CreateUserNameOverTransportBindingElement();
        // Create supporting token parameters for the client X509 certificate.
        X509SecurityTokenParameters clientX509SupportingTokenParameters = new X509SecurityTokenParameters();
        // Specify that the supporting token is passed in message send by the client to the service
        clientX509SupportingTokenParameters.InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient;
        // Turn off derived keys
        clientX509SupportingTokenParameters.RequireDerivedKeys = false;
        // Augment the binding element to require the client's X509 certificate as an endorsing token in the message
        messageSecurity.EndpointSupportingTokenParameters.Endorsing.Add(clientX509SupportingTokenParameters);
        // Create a CustomBinding based on the constructed security binding element.
        return new CustomBinding(messageSecurity, httpsTransport);

此客户端生成的 SOAP 消息非常接近于满足我正在调用的服务的要求,唯一的问题是正在对 wsa:To 地址以及时间戳地址进行签名。

有没有办法准确指定对哪些 WCF 标头进行签名?由于我需要限制客户端仅对时间戳标头进行签名。

使用自定义消息标头,您可以执行以下操作:

//... rest of MessageContract
[MessageHeader(ProtectionLevel = ProtectionLevel.Sign)]
string MyCustomHeader;
//... rest of MessageContract

但我认为这不适用于您的情况,因为您尝试签署由自定义绑定插入的 soap 标头。若要修改这些标头,可能需要实现 IClientMessageInspector 接口,并向客户端配置添加自定义行为以对时间戳标头进行签名。不确定如何访问证书以进行签名,但这可能会给您一个良好的开端。

我知道

这是一个老问题,但我已经被问过几次了。

我设法通过将消息版本指定为 Soap11 而不是 Soap11WSAddressing10 来实现这一点,然后手动添加 WS-Addresing 标头,从而避免了手动实现签名机制的需要。

相关内容

  • 没有找到相关文章

最新更新