2011-10-19 2 views
3

Nous essayons d'utiliser l'exemple ACS 4 (à partir de http://claimsid.codeplex.com/) comme modèle pour notre projet ADFS. Nous n'avons aucun problème avec les demandes passives aux services authentifiés ADFS. Dans l'exemple, le fournisseur de fédération est un STS personnalisé et l'exemple fonctionne correctement.Implémentation d'ACS avec et ADFS en tant que STS

Maintenant, nous souhaitons remplacer le fournisseur de fédération personnalisé (Adatum FP dans l'exemple) par notre propre système ADFS.

Notre bonne configuration est maintenant comme suit (espaces de noms cachés)

  • serviceclient: Console Applicaton, qui appelle les services
  • Services: WCF Webservice, méthode simple retour d'une chaîne. Ceci est la valeur par défaut [Ordertracking.Services dans l'exemple]
  • Services.Authentication: Notre fournisseur d'identité personnalisé. Ceci est par défaut [Litware.SimulatedIssuer dans l'échantillon]
  • ADFS: Notre fournisseur Fédération [FederationProvider.Adatum dans exemple]

serviceclient veut appeler les services, et de la configuration, il sait qu'il doit obtenir un jeton à partir de IP (Services.Authentication). Le jeton est ensuite transmis à ADFS, qui valide le jeton et renvoie un nouveau jeton à ServiceClient. Le client nouveau passe le jeton FP au service, et le service (étant une partie de confiance sur ADFS) vérifie le jeton contre ADFS et exécute la méthode de service.

La question:

Remplacement de la STS dans l'exemple avec ADFS, semble briser l'intégration. Nous semblons obtenir correctement le jeton de l'adresse IP, mais nous rencontrons des problèmes lors de la transmission du jeton IP à ADFS. Il semble que nous avons un problème avec notre public Uri de, mais nous avons ajouté

https: // 'adfs fqdn'/ADFS/services/Confiance/13/IssuedTokenMixedSymmetricBasic256

Exception client Nous obtenons un MessageSecurityException dans le client avec ce InnerException InnerException { « ID3242. le jeton de sécurité ne peut pas être authentifié ou autorisé »}

[System.ServiceModel.FaultException]: {"ID3242: The security token could not be authenticated or authorized."} 
Data: {System.Collections.ListDictionaryInternal} 
HelpLink: null 
InnerException: null 
Message: "ID3242: The security token could not be authenticated or authorized." 
Source: null 
StackTrace: null 
TargetSite: null 

ADFS journal de débogage

<TraceRecord xmlns="http://schemas.microsoft.com/2009/10/IdentityModel/TraceRecord" Severity="Error"> 
    <Description>Handled exception.</Description> 
    <AppDomain>Microsoft.IdentityServer.ServiceHost.exe</AppDomain> 
    <Exception> 
     <ExceptionType>Microsoft.IdentityModel.Tokens.AudienceUriValidationFailedException, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</ExceptionType> 
     <Message>ID1038: The AudienceRestrictionCondition was not valid because the specified Audience is not present in AudienceUris. Audience: 'https://<adfs fqdn>/adfs/services/Trust/13/IssuedTokenMixedSymmetricBasic256'</Message> 
     <StackTrace> 
    at Microsoft.IdentityModel.Tokens.SamlSecurityTokenRequirement.ValidateAudienceRestriction(IList`1 allowedAudienceUris, IList`1 tokenAudiences) at Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityTokenHandler.ValidateConditions(Saml2Conditions conditions, Boolean enforceAudienceRestriction) at Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityTokenHandler.ValidateToken(SecurityToken token) at Microsoft.IdentityServer.Service.Tokens.MSISSaml2TokenHandler.ValidateToken(SecurityToken token) at Microsoft.IdentityModel.Tokens.WrappedSaml2SecurityTokenAuthenticator.ValidateTokenCore(SecurityToken token) at System.IdentityModel.Selectors.SecurityTokenAuthenticator.ValidateToken(SecurityToken token) at Microsoft.IdentityModel.Tokens.WrappedSamlSecurityTokenAuthenticator.ValidateTokenCore(SecurityToken token) at System.IdentityModel.Selectors.SecurityTokenAuthenticator.ValidateToken(SecurityToken token) at System.ServiceModel.Security.ReceiveSecurityHeader.ReadToken(XmlReader reader, SecurityTokenResolver tokenResolver, IList`1 allowedTokenAuthenticators, SecurityTokenAuthenticator&amp;amp; usedTokenAuthenticator) at 
    .... 
     </StackTrace> 
    </Exception> 
</TraceRecord> 

Nous avons ajouté l'uri du public à notre IP Web.config:

<audienceUris mode="Always"> 
    <add value="https://<adfs fqdn>/adfs/services/Trust/13/IssuedTokenMixedSymmetricBasic256" /> 
</audienceUris> 

Si nécessaire, nous pouvons publier des fichiers de configuration supplémentaires et des captures d'écran de configuration ADFS.

Répondre

5

Cela a pris un peu de travail mais nous avons finalement résolu le problème. Au lieu de configurer cela, nous avons construit la connexion dans le code. Je pense que nous avons probablement eu une erreur quelque part dans la configuration du client.

Quelques conseils à tous ceux qui essayent de le faire - créez d'abord les connexions en code. La configuration XML est un peu plus difficile à utiliser.

Nous avons trouvé quelques exemples de code sur leastprivilege.com

private static SecurityToken GetIdPToken() 
    { 

     var factory = new WSTrustChannelFactory(
      new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), 
      "https://systemidp.dk/Issuer.svc"); 
     factory.TrustVersion = TrustVersion.WSTrust13; 

     factory.Credentials.UserName.UserName = "LITWARE\\rick"; 
     factory.Credentials.UserName.Password = "thisPasswordIsNotChecked"; 

     var rst = new RequestSecurityToken 
     { 
      RequestType = WSTrust13Constants.RequestTypes.Issue, 
      AppliesTo = new EndpointAddress("https://adfsfqdn/adfs/services/trust"), 
      KeyType = WSTrust13Constants.KeyTypes.Symmetric, 
      ReplyTo = "https://adfsfqdn/adfs/services/trust/13/issuedtokenmixedsymmetricbasic256/" 
     }; 
     factory.ConfigureChannelFactory(); 
     var channel = factory.CreateChannel(); 
     return channel.Issue(rst); 
    } 

    private static SecurityToken GetRSTSToken(SecurityToken idpToken) 
    { 
     var binding = new IssuedTokenWSTrustBinding(); 
     binding.SecurityMode = SecurityMode.TransportWithMessageCredential; 

     var factory = new WSTrustChannelFactory(
      binding, 
      "https://adfsfqdn/adfs/services/trust/13/issuedtokenmixedsymmetricbasic256/"); 
     factory.TrustVersion = TrustVersion.WSTrust13; 
     factory.Credentials.SupportInteractive = false; 

     var rst = new RequestSecurityToken 
     { 
      RequestType = WSTrust13Constants.RequestTypes.Issue, 
      AppliesTo = new EndpointAddress("https://services.dk/WebService.svc"), 
      KeyType = WSTrust13Constants.KeyTypes.Symmetric 
     }; 

     factory.ConfigureChannelFactory(); 
     var channel = factory.CreateChannelWithIssuedToken(idpToken); 
     return channel.Issue(rst); 
    } 

Création d'un appel WCF avec le jeton

var ipdtoken = GetIdPToken(); 
var stsToken = GetRSTSToken(ipdtoken); 
var binding = new WS2007FederationHttpBinding(WSFederationHttpSecurityMode.TransportWithMessageCredential); 
binding.Security.Message.EstablishSecurityContext = false; 
var factory = new ChannelFactory<IWebService>(binding, "https://services.dk/WebService.svc"); 

factory.ConfigureChannelFactory(); 
factory.Credentials.SupportInteractive = false; 

var serviceChannel = factory.CreateChannelWithIssuedToken(stsToken); 

var s = serviceChannel.GetUserInformation(); 
+4

conseils _Some à tous ceux qui essaient cela - construire les connexions dans le code premier. La configuration XML est un peu plus difficile à travailler. C'est le meilleur conseil que j'ai trouvé sur l'ensemble de mon voyage WIF. –

0

La configuration de publicUri sur votre adresse IP semble correcte. Je pense que ADFS est celui qui jette l'erreur ID3242. Pouvez-vous vérifier que votre adresse IP est correctement configurée sous Claim Provider Trusts sur votre serveur ADFS?

Si vous disposez des métadonnées de fédération de votre adresse IP, vous pouvez également essayer de les recréer dans ADFS.

Questions connexes