2017-02-20 4 views
1

я пытаю следующее:вызова службы 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") 
); 

Что будет дальше, я полностью не понимаю. У меня есть скрипач работает, когда я запускаю сценарий, и вот что я вижу:

  1. Первый запрос на /STS (как и ожидалось)
  2. В proxy.CrossGatewayQuery результаты в трех звонков в /Service:

    2.1. A SOAP call with action http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue

    2.2. A SOAP call with action 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, а затем один запрос к службе, передавая утверждение SAML, которое я получил от STS.

ответ

1

Первая проблема заключалась в повторном согласовании служебных полномочий.

Это изменение позаботилась о том, что:

binding.Security.Message.NegotiateServiceCredential = false 

Затем служба должна была включить WIF конфигурацию:

host.Credentials.UseIdentityConfiguration = true; 
host.Credentials.IdentityConfiguration = CreateIdentityConfig(); 

IdentityConfiguration CreateIdentityConfig() 
{ 
    IdentityConfiguration identityConfig = new IdentityConfiguration(false); 

    //AUDIENCE URI     
    //the token we receive contains this value, so if do not match we fail 
    identityConfig.AudienceRestriction.AllowedAudienceUris.Add(new Uri($"http://{Environment.MachineName}:8000/Service")); 

    //ISSUER NAME REGISTRY explicit the thumbprint of the accepted certificates, if the token coming in is not signed with any of these certificates then is considered invalid 
    var issuerNameRegistry = new ConfigurationBasedIssuerNameRegistry(); 
    issuerNameRegistry.AddTrustedIssuer("81 5b 06 b2 7f 5b 26 30 47 3b 8a b9 56 bb 9f 9f 8c 36 20 76", "signing certificate sts"); //STS signing certificate thumbprint 
    identityConfig.IssuerNameRegistry = issuerNameRegistry; 
    identityConfig.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None; 
    return identityConfig; 
} 

Там были другие изменения также, GitHub репо имеет обновленный код, который работает в master филиал.

Благодаря поддержке MS, которая провела меня, выяснив это.

Смежные вопросы