我在.NET 1.1和WSE 2.0中有一个Web服务,它使用WS-Security和x509证书进行签名和加密。我正在尝试配置一个WCF客户端来连接这个服务,这比我预期的更具挑战性。
我已经通过使用自定义绑定完成了大部分的版本控制问题,但我最后还是坚持了下来。 Web服务在响应SOAP信封中包含两个BinarySecurityToken元素 - 一个用于加密证书,另一个用于签名证书。
问题似乎是WCF在第二个令牌上窒息。这是错误消息:
“无法找到'System.IdentityModel.Tokens.X509SecurityToken'令牌类型的令牌身份验证器。根据当前安全设置,无法接受该类型的令牌。”
我发现this conversation on MSDN描述了我遇到的确切问题;但不幸的是它没有提供良好的解决方案。创建一个消息编码器来将信封破解成WCF可以处理的东西对我来说似乎是错误的。 WSE 2.0可以很好地处理内联安全令牌 - 必须有一种方法可以强制WCF执行相同的操作。
虽然我确实拥有原始WSE 2.0服务的完整源代码,但此时无法改变处理安全性的方式。
这是我目前正在使用的安全绑定元素:
Dim lSBE As New System.ServiceModel.Channels.AsymmetricSecurityBindingElement()
Dim lInitiatorTokenParameters As New System.ServiceModel.Security.Tokens.X509SecurityTokenParameters
lInitiatorTokenParameters.InclusionMode = System.ServiceModel.Security.Tokens.SecurityTokenInclusionMode.AlwaysToRecipient
lInitiatorTokenParameters.X509ReferenceStyle = System.ServiceModel.Security.Tokens.X509KeyIdentifierClauseType.RawDataKeyIdentifier
lInitiatorTokenParameters.RequireDerivedKeys = False
lSBE.InitiatorTokenParameters = lInitiatorTokenParameters
Dim lRecipientTokenParameters As New System.ServiceModel.Security.Tokens.X509SecurityTokenParameters
lRecipientTokenParameters.InclusionMode = System.ServiceModel.Security.Tokens.SecurityTokenInclusionMode.AlwaysToRecipient
lRecipientTokenParameters.X509ReferenceStyle = System.ServiceModel.Security.Tokens.X509KeyIdentifierClauseType.RawDataKeyIdentifier
lRecipientTokenParameters.RequireDerivedKeys = False
lSBE.RecipientTokenParameters = lRecipientTokenParameters
lSBE.MessageSecurityVersion = MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10
lSBE.DefaultAlgorithmSuite = System.ServiceModel.Security.SecurityAlgorithmSuite.Basic128Rsa15
lSBE.SetKeyDerivation(False)
lSBE.IncludeTimestamp = True
lSBE.AllowSerializedSigningTokenOnReply = True
lSBE.MessageProtectionOrder = System.ServiceModel.Security.MessageProtectionOrder.SignBeforeEncrypt