Question

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

Maintenant, nous voulons remplacer le fournisseur de fédération personnalisée (FP Adatum dans l'échantillon) avec nos propres ADFS.

Notre configuration est en ce moment comme suit (Namespaces caché)

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

serviceclient veut appeler les services, et de la configuration, il sait qu'il doit obtenir un jeton IP (Services.Authentication). Le jeton est ensuite transmis à ADFS, qui valide le jeton et envoie un nouveau retour à jeton serviceclient. Le client transmet nouveau le FP jeton pour le service, et le service (qui est 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 le jeton de la propriété intellectuelle en arrière correctement, mais nous courons des problèmes lors du passage 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 pouvait 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é le public uri à 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.

Était-ce utile?

La solution

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 avions probablement quelque part d'erreur dans la configuration du client.

Quelques conseils à tous ceux qui essaient cela - construire les connexions dans le code premier. La configuration XML est un peu plus difficile à travailler.

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();

Autres conseils

La configuration audienceUri sur votre IP semble bien. Je pense que ADFS est celui qui est jeter la faute ID3242. Pouvez-vous vérifier pour que votre IP est correctement configuré en fiducies de fournisseur de réclamation sur votre serveur ADFS?

Si vous avez vos métadonnées de fédération de IP à portée de main, vous pouvez également essayer de le recréer dans ADFS.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top