Partager via


Procédure : créer des informations d’identification de prise en charge

Il est possible d'avoir un modèle de sécurité personnalisé qui requiert plusieurs informations d'identification. Par exemple, un service peut exiger du client non seulement un nom d'utilisateur et un mot de passe, mais également une information d'identification qui prouve que le client a plus de 18 ans. La deuxième information d’identification est une information d’identification de prise en charge. Cette rubrique explique comment implémenter de telles informations d’identification dans un client Windows Communication Foundation (WCF).

Notes

La spécification pour la prise en charge d'informations d'identification fait partie de la spécification WS-SecurityPolicy. Pour plus d’informations, consultez Spécifications Web Services Security.

Supporting Tokens

En bref, lorsque vous utilisez la sécurité de message, une information d’identification principale est toujours utilisée pour sécuriser le message (par exemple, un certificat X.509 ou un ticket Kerberos).

Telle que définie par la spécification, une liaison de sécurité utilise des jetons pour sécuriser l’échange de messages. Un jeton est une représentation d’une information d’identification de sécurité.

La liaison de sécurité utilise un jeton principal identifié dans la stratégie de liaison de sécurité pour créer une signature. Cette signature est appelée signature de message.

Des jetons supplémentaires peuvent être spécifiés afin d'augmenter les revendications fournies par le jeton associé à la signature de message.

Endossement, signature et chiffrement

Une information d’identification de prise en charge provoque la transmission d’un jeton de prise en charge à l’intérieur du message. La spécification WS-SecurityPolicy définit quatre façons de joindre un jeton de prise en charge au message, comme décrit dans le tableau suivant.

Objectif Description
Signé Le jeton de prise en charge est inclus dans l'en-tête de sécurité et est signé par la signature de message.
Endossement Un jeton d’endossement signe la signature du message.
Signé et endossement Les jetons d'endossement signés signent l'élément ds:Signature entier produit à partir de la signature de message et sont eux-mêmes signés par cette signature de message ; autrement dit, les deux jetons (le jeton utilisé pour la signature de message et le jeton d'endossement signé) se signent l'un l'autre.
Signé et chiffrement Les jetons de prise en charge chiffrés et signés sont des jetons de prise en charge signés qui sont également chiffrés lorsqu'ils apparaissent dans le wsse:SecurityHeader.

Programmation d'informations d'identification de prise en charge

Pour créer un service qui utilise des jetons de prise en charge, vous devez créer une liaison <customBinding>. (Pour plus d’informations, consultez Comment : Créer une liaison personnalisée à l’aide de SecurityBindingElement.)

La première étape de création d’une liaison personnalisée consiste à créer un élément de liaison de sécurité, qui peut être l’un des trois types suivants :

Toutes les classes héritent de l'objet SecurityBindingElement, qui inclut quatre propriétés pertinentes :

Étendues

Il existe deux étendues pour les informations d'identification de prise en charge :

  • Les jetons de prise en charge de point de terminaison prennent en charge toutes les opérations d’un point de terminaison. Autrement dit, l'information d'identification que le jeton de prise en charge représente peut être utilisée chaque fois qu'une opération de point de terminaison est appelée.

  • Les jetons de prise en charge d’opération ne prennent en charge qu’une opération de point de terminaison spécifique.

Comme indiqué par les noms de propriétés, les informations d'identification de prise en charge peuvent être obligatoires ou facultatives. Autrement dit, l'information d'identification de prise en charge est utilisée si elle est présente, bien que cela ne soit pas nécessaire, mais l'authentification n'échouera pas si elle n'est pas présente.

Procédures

Pour créer une liaison personnalisée qui inclut des informations d’identification de prise en charge

  1. Créez un élément de liaison de sécurité. L'exemple suivant crée un SymmetricSecurityBindingElement avec le mode d'authentification UserNameForCertificate. Utiliser la méthode CreateUserNameForCertificateBindingElement.

  2. Ajoutez le paramètre de prise en charge à la collection de types retournée par la propriété appropriée (Endorsing, Signed, SignedEncrypted ou SignedEndorsed). Les types dans l'espace de noms System.ServiceModel.Security.Tokens incluent des types couramment utilisés, tels que X509SecurityTokenParameters.

Exemple

Description

L’exemple suivant crée une instance du SymmetricSecurityBindingElement et ajoute une instance de la classe KerberosSecurityTokenParameters à la collection retournée par la propriété Endorsing.

Code

public static Binding CreateMultiFactorAuthenticationBinding()
{
    HttpTransportBindingElement httpTransport = new HttpTransportBindingElement();

    // The message security binding element will be configured to require 2 tokens:
    // 1) A user name/password encrypted with the service token.
    // 2) A client certificate used to sign the message.

    // Instantiate a binding element that will require the user name/password token
    // in the message (encrypted with the server certificate).
    SymmetricSecurityBindingElement messageSecurity = SecurityBindingElement.CreateUserNameForCertificateBindingElement();

    // Create supporting token parameters for the client X.509 certificate.
    X509SecurityTokenParameters clientX509SupportingTokenParameters = new X509SecurityTokenParameters();
    // Specify that the supporting token is passed in the message send by the client to the service.
    clientX509SupportingTokenParameters.InclusionMode = SecurityTokenInclusionMode.AlwaysToRecipient;
    // Turn off derived keys.
    clientX509SupportingTokenParameters.RequireDerivedKeys = false;
    // Augment the binding element to require the client's X.509 certificate as an
    // endorsing token in the message.
    messageSecurity.EndpointSupportingTokenParameters.Endorsing.Add(clientX509SupportingTokenParameters);

    // Create a CustomBinding based on the constructed security binding element.
    return new CustomBinding(messageSecurity, httpTransport);
}

Voir aussi