这是这个问题的后续内容。可能与此没有直接关系。
我正试图调用一个使用令牌(联合安全,WS-Trust 1.3)保护的web服务,该令牌是我从安全令牌服务中获得的。我有了SecurityToken
(通用XML),并创建了一个ChannelFactory<T>
,然后在其上调用CreateChannelWithIssuedToken
。
当我试图调用一个服务方法时,实际的错误就会出现。消息很短,实际上我不知道下一步该往哪里看:MessageSecurityException
和消息无法创建令牌引用。嗯,这可能意味着任何事情。
相关代码:
var binding = new WS2007FederationHttpBinding(WSFederationHttpSecurityMode.TransportWithMessageCredential);
binding.Security.Message.EstablishSecurityContext = false;
var factory = new ChannelFactory<IService>(
binding,
new EndpointAddress("..."));
factory.Credentials.SupportInteractive = false;
var token = STSClient.Issue();
_channel = factory.CreateChannelWithIssuedToken(token);
呼叫服务是:
var svcParams = ...;
//MessageSecurityException is thrown here
var svcResponse = _channel.SomeServiceMethod(params);
我想知道的是我下一步可以去哪里看。是什么原因导致了这个错误?
其他详细信息:
- 该错误在向服务器发出任何请求之前抛出(与Fiddler一起检查)
- 服务器不是基于WCF的。它是一些符合WS-Trust和WS-Security的服务
实际上,问题是联邦绑定配置不足。因为我已经有了令牌,而且它已经签名,所以我应该将消息安全性上的IssuedKeyType
设置为SecurityKeyType.BearerKey
。
通过进一步处理,发现每次当没有足够的细节将令牌嵌入请求中时(通常是绑定或绑定的TransportSecurityBindingElement
上缺少配置),都会抛出Unable to create token reference
。
这并不能完全解决整个"使用令牌调用服务"的问题,但它确实解决了这个特定的错误:
var binding = new WS2007FederationHttpBinding(WSFederationHttpSecurityMode.TransportWithMessageCredential);
binding.Security.Message.EstablishSecurityContext = false;
binding.Security.Message.IssuedKeyType = SecurityKeyType.BearerKey;
binding.Security.Message.NegotiateServiceCredential = false;