我正在尝试配置我的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 标头,从而避免了手动实现签名机制的需要。