2

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

我正在尝试调用使用从安全令牌服务获得的令牌(联合安全性,WS-Trust 1.3)保护的 Web 服务。我有SecurityToken(通用 XML),我创建了一个ChannelFactory<T>然后调用CreateChannelWithIssuedToken.

当我尝试调用服务方法时会出现实际错误。消息很短,我实际上不知道接下来该往哪里看:MessageSecurityException和消息Unable to create token reference。嗯,这可能意味着任何事情。

相关代码:

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 的服务。
4

1 回答 1

2

实际上,问题是联邦绑定的配置不足。因为我已经拥有令牌并且已经签名,所以我应该IssuedKeyType将消息安全性设置为SecurityKeyType.BearerKey.

通过进一步玩这个结果,Unable to create token reference每次没有足够的细节来将令牌嵌入到请求中(通常它在绑定或绑定上缺少配置TransportSecurityBindingElement)时都会抛出。

这并不能完全解决整个“使用令牌调用服务”问题,但它确实解决了这个特定错误:

var binding = new WS2007FederationHttpBinding(WSFederationHttpSecurityMode.TransportWithMessageCredential);
binding.Security.Message.EstablishSecurityContext = false;
binding.Security.Message.IssuedKeyType = SecurityKeyType.BearerKey;
binding.Security.Message.NegotiateServiceCredential = false;
于 2014-09-08T09:28:11.037 回答