3

我正在为不受我控制的 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;
4

3 回答 3

1

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

于 2012-05-01T09:52:32.967 回答
1

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

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

但是我看不到删除此 api 中的元素的方法 - 只是添加一些。也许你可以用私人反射来破解它。

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

于 2012-05-02T15:37:47.690 回答
0

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

于 2012-08-24T10:49:48.183 回答