我在 .NET 1.1 和 WSE 2.0 中有一个 Web 服务,它使用 WS-Security 和 x509 证书进行签名和加密。我正在尝试配置 WCF 客户端以连接此服务,但事实证明它比我预期的更具挑战性。
通过使用自定义绑定,我已经解决了大部分版本控制问题,但我被困在最后一点。Web 服务在响应 SOAP 信封中包含两个 BinarySecurityToken 元素——一个用于加密证书,一个用于签名证书。
问题似乎是 WCF 在第二个令牌上窒息。这是错误消息:
“找不到 'System.IdentityModel.Tokens.X509SecurityToken' 令牌类型的令牌身份验证器。根据当前的安全设置,无法接受该类型的令牌。”
我在 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