无法序列化Saml2AssertionKeyIdentifierClause

时间:2012-07-03 13:45:16

标签: wif thinktecture-ident-server

我正在尝试整合一个声明感知的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'。   如果这是自定义类型,则必须提供自定义序列化程序。

我能找到的唯一提到的问题是this one on the MSDN forums,但这只是略有关联。

查看调试器,似乎端点行为包括(最终)Saml2SecurityTokenHandler,其他链接暗示的就是所需的全部内容。

我错过了什么?

2 个答案:

答案 0 :(得分: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部分。

答案 1 :(得分:0)

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

确保在配置中包含以下设置:

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

相关问题