3

我正在尝试将声明感知的 WCF 服务和客户端放在一起。

我正在使用thinktecture Identity Server,并且通过查看“使用带有 WCF/SOAP 的令牌”示例来组合一个控制台客户端:

var token = GetSecurityToken();

var binding =
    new WS2007FederationHttpBinding(
        WSFederationHttpSecurityMode.TransportWithMessageCredential);
binding.Security.Message.EstablishSecurityContext = false;

var factory =
    new ChannelFactory<IService1>(
        binding,
        new EndpointAddress("https://localhost:44301/Service1.svc"));
factory.Credentials.SupportInteractive = false;

factory.ConfigureChannelFactory();

var service = factory.CreateChannelWithIssuedToken(token);
var result = service.GetData(42);

我有(看起来像)来自 STS 的有效令牌。

但是,它会在对 的调用中引发异常GetData,如下所示:

序列化安全密钥标识符时出错。有关更多详细信息,请参阅内部异常。

内部异常如下:

令牌序列化程序无法序列化“System.IdentityModel.Tokens.Saml2AssertionKeyIdentifierClause”。如果这是自定义类型,则必须提供自定义序列化程序。

我能找到的唯一提到的这个问题是MSDN 论坛上的这个问题,但这只是稍微相关。

在调试器中查看,端点行为似乎包括(最终)一个 Saml2SecurityTokenHandler,其他链接暗示这就是所需要的。

我错过了什么?

4

2 回答 2

8

当我从 startersts 升级到 identityserver v2 并从 saml1.1 切换到 saml2 时,我刚才遇到了完全相同的问题。

我不生成代理,所以解决我的问题是在我的通道工厂上简单地将 Credentials.UseIdentityConfiguration 设置为 true。如果您生成代理,默认情况下可能不会这样做?或者,如果您使用自定义 ChannelFactory,您可能只是忘记像我一样设置它。

var channelFactory = new ChannelFactory<T>(endpointName);
channelFactory.Credentials.UseIdentityConfiguration = true;

var channel = channelFactory.CreateChannelWithIssuedToken(token)

...现在使用没有序列化异常的通道

希望它有所帮助,无需像其他讨论线程所建议的那样在客户端添加 system.identityModel 部分。

于 2013-05-08T16:40:34.620 回答
0

您的 WCF 服务中是否启用了 WIF?

确保您在配置中有这些设置:

在 serviceCredentials 行为中 - useIdentityConfiguration = true 在 serviceAuthorization 行为中 - principalPermissionMode = always

于 2012-07-03T16:00:49.410 回答