如何控制在WCF SOAP请求中签名的元素?

时间:2012-05-01 04:26:03

标签: wcf ws-security

我正在为我无法控制的Java Web服务创建一个WCF客户端,并且遇到了问题,如果Timestamp标头元素已签名,则服务返回InvalidSecurity错误。

我目前正在使用以下SecurityBindingElement,但这会自动签署Timestamp元素。我怎么能阻止这种行为?更一般地说,我如何控制哪些元素已签名?哪些元素未签名?

var version = MessageSecurityVersion.WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10;
var sec = (AsymmetricSecurityBindingElement)SecurityBindingElement.CreateMutualCertificateBindingElement(version);
sec.EndpointSupportingTokenParameters.Signed.Add(new UserNameSecurityTokenParameters());
sec.MessageSecurityVersion = version;
sec.IncludeTimestamp = true;
sec.MessageProtectionOrder = MessageProtectionOrder.EncryptBeforeSign;

3 个答案:

答案 0 :(得分:1)

标题中的每个元素都可以使用[MessageHeader]标记 - 您可以使用此设置保护级别。

答案 1 :(得分:1)

通常,您可以通过实现自定义端点行为来控制哪些元素被签名,并且在AddBindingParameters()中执行以下操作:

ChannelProtectionRequirements requirements = bindingParameters.Find<ChannelProtectionRequirements>();
requirements.IncomingSignatureParts...

但是我没有看到在这个api中删除元素的方法 - 只是添加一些。也许你可以用私人反思破解这个。

此外,我不确定这是否适用于安全性。我认为您唯一的方法是将“includeTimestamp”设置为false,在这种情况下,您不会向客户端发送时间戳。如果您必须发送时间戳(无符号),那么仍然保持错误并通过custom encoder自己创建时间戳。应该不难。如果已签名,请注意不要更改邮件中的任何其他内容。

答案 2 :(得分:0)

我无法对答案进行投票,但克里斯的建议对我有用。我想阻止签署正文(因此期待签署的回复正文)。我转到我的界面,并将MessageLevel = None添加到MessageContracts中MessageBody属性的每个实例。由于不需要对任何部分进行签名,因此WCF会跳过对请求正文的签名,并且不希望对响应正文进行签名。它仍然标志着我的标题字段。