无法跟踪使用CreateChannelWithIssuedToken创建的WCF客户端的错误

本文关键字:WCF 客户端 错误 创建 CreateChannelWithIssuedToken 跟踪 | 更新日期: 2023-09-27 18:19:32

这是这个问题的后续内容。可能与此没有直接关系。

我正试图调用一个使用令牌(联合安全,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); 

我想知道的是我下一步可以去哪里看。是什么原因导致了这个错误?

其他详细信息:

  1. 该错误在向服务器发出任何请求之前抛出(与Fiddler一起检查)
  2. 服务器不是基于WCF的。它是一些符合WS-Trust和WS-Security的服务

无法跟踪使用CreateChannelWithIssuedToken创建的WCF客户端的错误

实际上,问题是联邦绑定配置不足。因为我已经有了令牌,而且它已经签名,所以我应该将消息安全性上的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;