我正在尝试整合一个声明感知的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,其他链接暗示的就是所需的全部内容。
我错过了什么?
答案 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