我嘗試以下操作:調用WCF服務發出的令牌
- 一個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/Issue
2.2。帶有動作的SOAP調用
http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Issue
2.3。最後的SOAP調用動作爲
urn:ihe:iti:2007:CrossGatewayQuery
。使用Fiddler,我注意到SOAP安全頭包含第一步中的SAML斷言。
最終調用導致從服務返回SOAP錯誤:消息中至少有一個安全令牌無法驗證。保存的提琴手請求/響應日誌是在這裏:https://drive.google.com/file/d/0B-UZlLvBjjB2S050TXRhVEo2Vmc/view?usp=sharing
如果有誰能夠告訴我關於下面,我將非常感激:
- 爲什麼WCF客戶端發送
RST/Issue
和RSTS/Issue
請求到/Service
(上述步驟2.1和2.2)? - 如何配置這些組件以完成我想要的操作,即向STS發送一個請求,然後向服務發送一個請求,傳遞從STS獲得的SAML斷言。