2013-03-09 3 views
3

Mon site Web implémente l'authentification basée sur AD FS. Maintenant, j'ai besoin d'accéder par programme à mon site Web via un client. Mon client doit demander le jeton de sécurité du serveur ADFS en utilisant le contexte de l'utilisateur actuellement connecté. J'ai réussi à demander le jeton de sécurité à partir du point de terminaison adfs/services/trust/13/usernamemixed en utilisant le nom d'utilisateur et le mot de passe du client et l'afficher sur mon site Web. Ce qui ne fonctionne pas pour moi, c'est de demander le même jeton du point de terminaison adfs/services/trust/13/windowsmixed en utilisant le. J'obtiens l'erreur The HTTP request was forbidden with client authentication scheme 'Anonymous'.. J'utilise Microsoft.IdentityModel SDK (au lieu de System.IdentityModel dans .NET 4.5).RequestSecurityToken de STS et le poster sur mon site Web

Voici un extrait de mon code. Je n'ai aucun contrôle sur le serveur ADFS et ne peux pas déboguer ce qui ne va pas à partir de là. Tout ce que je peux faire est seulement à la fin du client. Une idée de ce qui ne va pas avec mon code ci-dessus? Toute aide ou pointeurs sont grandement appréciés.

Répondre

1

Je pense que vous devez définir EstablishSecurityContext de sécurité des messages comme FAUX
binding.Security.Message.EstablishSecurityContext = false;

Le code suivant fonctionne pour moi.

  WS2007HttpBinding binding = new WS2007HttpBinding(SecurityMode.TransportWithMessageCredential); 
      binding.Security.Message.EstablishSecurityContext = false;    
      binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; 
      if (isWindowsUser) 
      { 
       binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 
       ep = new EndpointAddress("https://abc.com/adfs/services/trust/13/windowsmixed");      
      } 
      else 
      { 
       binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; 
       ep = new EndpointAddress("https://abc.com/adfs/services/trust/13/usernamemixed");      
      } 
      factory = new WSTrustChannelFactory(binding, ep); 
      factory.TrustVersion = TrustVersion.WSTrust13; 

       factory.Credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;      


      var rst = new RequestSecurityToken 
      { 
       RequestType = RequestTypes.Issue, 
       AppliesTo = new EndpointReference("urn:adfsmonitor"), 
       KeyType = KeyTypes.Bearer, 
      }; 
      IWSTrustChannelContract channel = factory.CreateChannel(); 
      GenericXmlSecurityToken genericToken = channel.Issue(rst) 
      as GenericXmlSecurityToken; 
      return genericToken.TokenXml.InnerXml.ToString(); 
Questions connexes