【发布时间】:2017-02-20 10:27:06
【问题描述】:
我尝试以下方法:
- WCF 客户端调用 STS 并获取 SAML 断言
- 客户端使用 SAML 断言调用服务
现在我已将上述场景实现为三个 LinqPad 脚本:client.linq、sts.linq(自托管 WCF 服务)和 service.linq(自托管 WCF 服务)。他们都可以在https://github.com/codeape2/WCF_STS找到。
我需要一些帮助才能让它工作。
使用client.linq 中的以下代码,我可以调用我的 STS 并获得 SAML 断言:
SecurityToken GetToken()
{
var binding = new BasicHttpBinding();
var factory = new WSTrustChannelFactory(binding, stsAddress);
factory.TrustVersion = TrustVersion.WSTrustFeb2005;
var rst = new RequestSecurityToken
{
RequestType = RequestTypes.Issue,
KeyType = KeyTypes.Symmetric,
AppliesTo = new EndpointReference(serviceAddress)
};
return factory.CreateChannel().Issue(rst);
}
下一步,我使用以下代码(尝试)调用包含 SAML 断言的服务:
var binding = new WSFederationHttpBinding(WSFederationHttpSecurityMode.Message);
binding.Security.Message.EstablishSecurityContext = false;
var factory = new ChannelFactory<ICrossGatewayQueryITI38>(
binding,
new EndpointAddress(new Uri(serviceAddress), new DnsEndpointIdentity("LocalSTS"))
);
factory.Credentials.SupportInteractive = false;
factory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode =
X509CertificateValidationMode.None;
var proxy = factory.CreateChannelWithIssuedToken(token);
var response = proxy.CrossGatewayQuery(
Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:ihe:iti:2007:CrossGatewayQuery", "Hello world")
);
接下来会发生什么我完全不明白。我在运行脚本时正在运行提琴手,这就是我所看到的:
- 对
/STS的第一个请求(如预期) -
proxy.CrossGatewayQuery导致对/Service的三个调用:2.1。带有操作
的 SOAP 调用http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue2.2。带有操作
的 SOAP 调用http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Issue2.3。带有操作
urn:ihe:iti:2007:CrossGatewayQuery的最终 SOAP 调用。使用 Fiddler,我注意到 SOAP 安全标头包含第一步中的 SAML 断言。
最终调用导致服务返回 SOAP 错误:无法验证消息中的至少一个安全令牌。保存的 Fiddler 请求/响应日志在这里:https://drive.google.com/file/d/0B-UZlLvBjjB2S050TXRhVEo2Vmc/view?usp=sharing
如果有人能就以下内容启发我,我将不胜感激:
- 为什么 WCF 客户端将
RST/Issue和RSTS/Issue请求发送到/Service(上面的步骤 2.1 和 2.2)? - 如何配置这些部分以执行我想要的操作,即向 STS 发送一个请求,然后向服务发送一个请求,传递我从 STS 获得的 SAML 断言。
【问题讨论】: