如何控制在 WCF SOAP 请求中对哪些元素进行签名



我正在为一个 Java Web 服务创建一个 WCF 客户端,该客户端超出了我的控制范围,并且遇到了一个问题,因为如果对 Timestamp 标头元素进行签名,该服务将返回 InvalidSecurity 错误。

我目前正在使用以下SecurityBindingElement,但这会自动对时间戳元素进行签名。如何阻止此行为?更一般地说,如何控制哪些元素是有符号的,哪些不是?

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;
通常,

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

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

但是,我没有看到删除此 API 中的元素的方法 - 只能添加一些。也许你可以通过私人反思来破解它。

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

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

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

最新更新