Partager via


Procédure : créer un WSFederationHttpBinding

Dans Windows Communication Foundation (WCF), la classe WSFederationHttpBinding (<wsFederationHttpBinding> dans une configuration) fournit un mécanisme permettant d’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.

    Notes

    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 une classe WSFederationHttpBinding alors que son mode de sécurité est défini sur None, la liaison client obtenue (générée par l’Outil Service Model Metadata Utility (SvcUtil.exe)) est une classe WSHttpBinding avec un mode de sécurité 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. Cela est dû au fait que 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 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é.

Notes

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 WSFederationHttpSecurityMode ou Message 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. Définissez la propriété IssuedKeyType sur SecurityKeyType ou SymmetricKey.AsymmetricKey si nécessaire.

  5. Affectez la valeur appropriée à la propriété IssuedTokenType. Si aucune valeur n’est définie, WCF est défini par défaut sur http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1, ce qui indique les 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 une classe 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 une <wsFederationHttpBinding> 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>, et définissez l’attribut name sur 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. Optionnel. 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. Optionnel. 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 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> à 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("http://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("http://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;
}
' This method creates a WSFederationHttpBinding.
Public Shared Function CreateWSFederationHttpBinding(ByVal isClient As Boolean) As WSFederationHttpBinding
    ' Create an instance of the WSFederationHttpBinding.
    Dim b As New WSFederationHttpBinding()
    With b.Security
        ' Set the security mode to Message.
        .Mode = WSFederationHttpSecurityMode.Message

        With .Message
            ' Set the Algorithm Suite to Basic256Rsa15.
            .AlgorithmSuite = SecurityAlgorithmSuite.Basic256Rsa15

            ' Set NegotiateServiceCredential to true.
            .NegotiateServiceCredential = True

            ' Set IssuedKeyType to Symmetric.
            .IssuedKeyType = SecurityKeyType.SymmetricKey

            ' Set IssuedTokenType to SAML 1.1
            .IssuedTokenType = "http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#samlv1.1"
        End With
    End With

    ' Extract the STS certificate from the certificate store.
    Dim store As New X509Store(StoreName.TrustedPeople, StoreLocation.CurrentUser)
    store.Open(OpenFlags.ReadOnly)
    Dim certs = store.Certificates.Find(X509FindType.FindByThumbprint, _
                                        "0000000000000000000000000000000000000000", _
                                        False)
    store.Close()

    ' Create an EndpointIdentity from the STS certificate.
    Dim identity = EndpointIdentity.CreateX509CertificateIdentity(certs(0))

    ' Set the IssuerAddress using the address of the STS and the previously created 
    ' EndpointIdentity.
    With b.Security.Message
        .IssuerAddress = New EndpointAddress(New Uri("http://localhost:8000/sts/x509"), _
                                                                           identity)

        ' Set the IssuerBinding to a WSHttpBinding loaded from configuration. 
        ' The IssuerBinding is only used on federated clients.
        If isClient Then
            .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
            .IssuerMetadataAddress = New EndpointAddress(New Uri("http://localhost:8001/sts/mex"), _
                                                                           identity)
        End If
        ' Create a ClaimTypeRequirement.
        Dim ctr As New ClaimTypeRequirement("http://example.org/claim/c1", _
                                            False)

        ' Add the ClaimTypeRequirement to ClaimTypeRequirements
        .ClaimTypeRequirements.Add(ctr)
    End With

    ' Return the created binding
    Return b
End Function

Voir aussi