Comment : créer une liaison WSFederationHttpBinding

Dans Windows Communication Foundation (WCF), la classe WSFederationHttpBinding (wsFederationHttpBinding element dans la configuration) fournit un mécanisme pour exposer un service fédéré, autrement dit, un service qui oblige les clients à s'authentifier à l'aide d'un jeton de sécurité émis par un service de jeton de sécurité. Cette rubrique montre comment installer WSFederationHttpBinding dans le code et la configuration. Une fois la liaison créée, vous pouvez installer un point de terminaison pour utiliser cette liaison.

Les étapes de base sont les suivantes :

  1. Sélectionnez un mode de sécurité. WSFederationHttpBinding prend en charge Message, qui fournit la sécurité de bout en bout au niveau du message, même avec plusieurs sauts, et TransportWithMessageCredential, qui fournit les meilleures performances dans les cas où le client et le service peuvent établir une connexion directe sur HTTPS.

    Aa347982.note(fr-fr,VS.100).gifRemarque :
    WSFederationHttpBinding prend également en charge None comme mode de sécurité. Ce mode, non sécurisé, est fourni à des fins de débogage uniquement. Si un point de terminaison de service est déployé avec WSFederationHttpBinding alors que son mode de sécurité a la valeur None, la liaison cliente obtenue (générée par l'Outil Service Model Metadata Tool (Svcutil.exe)) est WsHttpBinding avec un mode de sécurité ayant la valeur None.

    Contrairement à d'autres liaisons fournies par le système, il n'est pas nécessaire de sélectionner un type d'informations d'identification du client lors de l'utilisation de WSFederationHttpBinding. En effet, le type d'informations d'identification du client est toujours un jeton émis. WCF acquiert un jeton d'un émetteur spécifié et présente ce jeton au service pour authentifier le client.

  2. Sur les clients fédérés, affectez à la propriété IssuerAddress l'URL du service de jeton de sécurité. Affectez au IssuerBinding la liaison à utiliser pour communiquer avec le service de jeton de sécurité.

  3. Facultatif. Affectez à la propriété IssuedTokenType l'URI (Uniform Resource Identifier) d'un type de jeton. Sur les services fédérés, spécifiez le type de jeton que le service attend. Sur les clients fédérés, spécifiez le type de jeton que le client demande au service de jeton de sécurité.

    Si aucun type de jeton n'est spécifié, les clients génèrent des jetons RST (Request Security Token) WS-Trust sans l'URI d'un type de jeton, et les services attendent l'authentification du client à l'aide d'un jeton SAML (Security Assertions Markup Language) 1.1 par défaut.

    L'URI d'un jeton SAML 1.1 est "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1".

  4. Facultatif. Sur les services fédérés, affectez à la propriété IssuerMetadataAddress l'URL de métadonnées d'un service de jeton de sécurité. Le point de terminaison de métadonnées permet aux clients du service de sélectionner une paire liaison/point de terminaison appropriée, si le service est configuré pour publier des métadonnées. Pour plus d'informations sur le sujet suivant la publication de métadonnées, consultez Publication de métadonnées.

Vous pouvez également définir d'autres propriétés, y compris le type de clé utilisé comme clé de vérification dans le jeton émis, la suite algorithmique à utiliser entre le client et le service, l'option de négocier ou de spécifier explicitement les informations d'identification du service, toutes les revendications spécifiques que le service s'attend à trouver dans le jeton émis et tous les éléments XML supplémentaires qui doivent être ajoutés à la demande que le client envoie au service de jeton de sécurité.

Aa347982.note(fr-fr,VS.100).gifRemarque :
La propriété NegotiateServiceCredential n'est pertinente que si SecurityMode a la valeur Message. Si SecurityMode a la valeur TransportWithMessageCredential, alors la propriété NegotiateServiceCredential est ignorée.

Pour configurer une liaison WSFederationHttpBinding dans le code

  1. Créez une instance de WSFederationHttpBinding.

  2. Affectez à la propriété Mode la valeur Message ou TransportWithMessageCredential selon le cas. Si une suite algorithmique autre que Basic256 est requise, affectez à la propriété AlgorithmSuite une valeur extraite de SecurityAlgorithmSuite.

  3. Définissez la propriété NegotiateServiceCredential comme il convient.

  4. Affectez à la propriété IssuedKeyType la valeur SecurityKeyType SymmetricKey ou .AsymmetricKey selon le cas.

  5. Affectez la valeur appropriée à la propriété IssuedTokenType. Si aucune valeur n'est définie, WCF a la valeur par défaut "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1", qui indique des jetons SAML 1.1.

  6. Requis sur le client si aucun émetteur local n'est spécifié ; facultatif sur le service. Créez un EndpointAddress qui contient les informations d'adresse et d'identité du service de jeton de sécurité et assignez l'instance EndpointAddress à la propriété IssuerAddress.

  7. Requis sur le client si aucun émetteur local n'est spécifié ; non utilisé sur le service. Créez Binding pour SecurityTokenService et assignez l'instance Binding à la propriété IssuerBinding.

  8. Non utilisé sur le client ; facultatif sur le service. Créez une instance EndpointAddress pour les métadonnées du service de jeton de sécurité et assignez-la à la propriété IssuerMetadataAddress.

  9. Facultatif sur le client et le service. Créez et ajoutez une ou plusieurs instances ClaimTypeRequirement à la collection retournée par la propriété ClaimTypeRequirements.

  10. Facultatif sur le client et le service. Créez et ajoutez une ou plusieurs instances XmlElement à la collection retournée par la propriété TokenRequestParameters.

Pour créer un point de terminaison fédéré dans la configuration

  1. Créez wsFederationHttpBinding element en tant qu'enfant de l'élément <bindings> dans le fichier de configuration de l'application.

  2. Créez un élément binding en tant qu'enfant de wsFederationHttpBinding element et affectez à l'attribut name une valeur appropriée.

  3. Créez un élément <security> en tant qu'enfant de l'élément binding.

  4. Affectez à l'attribut mode sur l'élément <security> une valeur de Message ou de TransportWithMessageCredential, selon le cas.

  5. Créez un élément <message> en tant qu'enfant de l'élément <security>.

  6. Facultatif. Affectez une valeur appropriée à l'attribut algorithmSuite sur l'élément <message>. La valeur par défaut est Basic256.

  7. Facultatif. Si une clé de vérification asymétrique est requise, affectez à l'attribut issuedKeyType de l'élément <message> la valeur AsymmetricKey. La valeur par défaut est SymmetricKey.

  8. Facultatif. Définissez l'attribut issuedTokenType sur l'élément <message>.

  9. Requis sur le client si aucun émetteur local n'est spécifié ; facultatif sur le service. Créez un élément <issuer> en tant qu'enfant de l'élément <message>.

  10. Affectez l'attribut address à l'élément <issuer> et spécifiez l'adresse à laquelle le service de jeton de sécurité accepte des demandes de jeton.

  11. Facultatif. Ajoutez un élément enfant <identity> et spécifiez l'identité du service de jeton de sécurité.

  12. Pour plus d'informations, consultez Identité du service et authentification.

  13. Requis sur le client si aucun émetteur local n'est spécifié ; non utilisé sur le service. Créez un élément <binding> dans la section des liaisons, qui peut servir à communiquer avec le service de jeton de sécurité. Pour plus d'informations sur le sujet suivant la création d'une liaison, consultez Comment : spécifier une liaison de service dans la configuration.

  14. Spécifiez la liaison créée à l'étape précédente en définissant les attributs binding et bindingConfiguration de l'élément <issuer>.

  15. Non utilisé sur le client ; facultatif sur le service. Créez un élément <issuerMetadata> en tant qu'enfant de l'élément <message>. Puis, dans un attribut address sur l'élément <issuerMetadata>, spécifiez l'adresse à laquelle le service de jeton de sécurité doit publier ses métadonnées. Éventuellement, ajoutez un élément enfant <identity> et spécifiez l'identité du service de jeton de sécurité.

  16. Facultatif sur le client et le service. Ajoutez un élément <claimTypeRequirements> en tant qu'enfant de l'élément <message>. Spécifiez les revendications requises et facultatives sur lesquelles repose le service en ajoutant des éléments <add> of <claimTypeRequirements> à l'élément <claimTypeRequirements> et en spécifiant le type de revendication avec l'attribut claimType. Spécifiez si une revendication donnée est requise ou facultative en définissant l'attribut isOptional.

Exemple

L'exemple de code suivant montre comment installer WSFederationHttpBinding de façon impérative.

// This method creates a WSFederationHttpBinding.
public static WSFederationHttpBinding 
    CreateWSFederationHttpBinding(bool isClient)
{
  // Create an instance of the WSFederationHttpBinding.
  WSFederationHttpBinding b = new WSFederationHttpBinding();

  // Set the security mode to Message.
  b.Security.Mode = WSFederationHttpSecurityMode.Message;
  
  // Set the Algorithm Suite to Basic256Rsa15.
  b.Security.Message.AlgorithmSuite = SecurityAlgorithmSuite.Basic256Rsa15;

  // Set NegotiateServiceCredential to true.
  b.Security.Message.NegotiateServiceCredential = true;

  // Set IssuedKeyType to Symmetric.
  b.Security.Message.IssuedKeyType = SecurityKeyType.SymmetricKey;

  // Set IssuedTokenType to SAML 1.1
  b.Security.Message.IssuedTokenType = 
      "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#samlv1.1";
        
  // Extract the STS certificate from the certificate store.
  X509Store store = new X509Store(StoreName.TrustedPeople, StoreLocation.CurrentUser);
  store.Open(OpenFlags.ReadOnly);
  X509Certificate2Collection certs = store.Certificates.Find(
      X509FindType.FindByThumbprint, "0000000000000000000000000000000000000000", false);
  store.Close();
  
  // Create an EndpointIdentity from the STS certificate.
  EndpointIdentity identity = EndpointIdentity.CreateX509CertificateIdentity ( certs[0] );
  
  // Set the IssuerAddress using the address of the STS and the previously created 
  // EndpointIdentity.
  b.Security.Message.IssuerAddress = 
      new EndpointAddress(new Uri("https://localhost:8000/sts/x509"), identity);

  // Set the IssuerBinding to a WSHttpBinding loaded from configuration. 
  // The IssuerBinding is only used on federated clients.
  if (isClient)
  {
      b.Security.Message.IssuerBinding = new WSHttpBinding("Issuer");
  }

  // Set the IssuerMetadataAddress using the metadata address of the STS and the
  // previously created EndpointIdentity. The IssuerMetadataAddress is only used 
  // on federated services.
  else
  {
      b.Security.Message.IssuerMetadataAddress =
          new EndpointAddress(new Uri("https://localhost:8001/sts/mex"), identity);
  }
  // Create a ClaimTypeRequirement.
  ClaimTypeRequirement ctr = new ClaimTypeRequirement 
      ("http://example.org/claim/c1", false);

  // Add the ClaimTypeRequirement to ClaimTypeRequirements
  b.Security.Message.ClaimTypeRequirements.Add(ctr);
  
  // Return the created binding
  return b;
}

Voir aussi

Tâches

Federation, exemple
Comment : désactiver des sessions sécurisées sur une classe WSFederationHttpBinding

Concepts

Fédération