Procédure : spécifier des informations d’identification de client

À l’aide de Windows Communication Foundation (WCF), le service peut spécifier la façon dont un client est authentifié auprès du service. Par exemple, un service peut stipuler que le client soit authentifié avec un certificat.

Pour déterminer le type d'informations d'identification du client

  1. Récupérez les métadonnées à partir du point de terminaison des métadonnées du service. Les métadonnées se composent généralement de deux fichiers : le code client dans le langage de programmation de votre choix (la valeur par défaut est Visual C#) et un fichier de configuration XML. L'une des manières permettant de récupérer des métadonnées consiste à utiliser l'outil Svcutil.exe pour retourner le code client et la configuration cliente. Pour plus d’informations, consultez Récupération de métadonnées et Outil Service Model Metadata Tool (Svcutil.exe).

  2. Ouvrez le fichier de configuration XML. Si vous utilisez l'outil Svcutil.exe, le nom par défaut du fichier est Output.config.

  3. Recherchez l’élément <security> avec l’attribut mode (<security mode =MessageOrTransport>MessageOrTransport est défini avec l’un des modes de sécurité.

  4. Recherchez l'élément enfant qui correspond à la valeur de mode. Par exemple, si le mode est défini sur Message, recherchez l’élément <message> contenu dans l’élément <security>.

  5. Notez la valeur affectée à l’attribut clientCredentialType. La valeur réelle dépend du mode utilisé, du transport ou du message.

Le code XML suivant montre la configuration pour un client utilisant la sécurité du message et nécessitant un certificat pour authentifier le client.

<security mode="Message">
    <transport clientCredentialType="Windows" proxyCredentialType="None"
        realm="" />
     <message clientCredentialType="Certificate" negotiateServiceCredential="true"
    algorithmSuite="Default" establishSecurityContext="true" />
</security>

Exemple : mode de transport TCP avec certificat comme informations d'identification du client

Cet exemple définit le mode de sécurité sur le mode Transport et définit la valeur d'informations d'identification du client sur un certificat X.509. Les procédures suivantes montrent comment définir la valeur d'information d'identification du client sur le client dans le code et dans la configuration. Elles supposent que vous avez utilisé l’outil ServiceModel Metadata Utility Tool (Svcutil.exe) pour retourner les métadonnées (code et configuration) du service. Pour plus d’informations, consultez Comment créer un client.

Pour spécifier la valeur d'information d'identification du client sur le client dans le code

  1. Utilisez l’outil ServiceModel Metadata Utility Tool (Svcutil.exe) pour générer le code et la configuration du service.

  2. Créez une instance du client WCF à l’aide du code généré.

  3. Sur la classe de client, affectez à la propriété ClientCredentials de la classe ClientBase<TChannel> une valeur appropriée. Cet exemple affecte à la propriété un certificat X.509 à l'aide de la méthode SetCertificate de la classe X509CertificateInitiatorClientCredential.

    // Create a binding using Transport and a certificate.
    NetTcpBinding b = new NetTcpBinding();
    b.Security.Mode = SecurityMode.Transport;
    b.Security.Transport.ClientCredentialType =
        TcpClientCredentialType.Certificate;
    
    // Create an EndPointAddress.
    EndpointAddress ea = new EndpointAddress(
        "net.tcp://localHost:8036/Calculator/MyCalculator");
    
    // Create the client.
    CalculatorClient cc = new CalculatorClient(b, ea);
    
    // Set the certificate for the client.
    cc.ClientCredentials.ClientCertificate.SetCertificate(
        StoreLocation.LocalMachine,
        StoreName.My,
        X509FindType.FindBySubjectName,
        "cohowinery.com");
    try
    {
        cc.Open();
        // Begin using the client.
        Console.WriteLine(cc.Divide(1001, 2));
        cc.Close();
    }
    catch (AddressAccessDeniedException adExc)
    {
        Console.WriteLine(adExc.Message);
        Console.ReadLine();
    }
    catch (System.Exception exc)
    {
        Console.WriteLine(exc.Message);
        Console.ReadLine();
    }
    
    ' Create a binding using Transport and a certificate.
    Dim b As New NetTcpBinding()
    b.Security.Mode = SecurityMode.Transport
    b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate
    
    ' Create an EndPointAddress.
    Dim ea As New EndpointAddress("net.tcp://localHost:8036/Calculator/MyCalculator")
    
    ' Create the client.
    Dim cc As New CalculatorClient(b, ea)
    
    ' Set the certificate for the client.
    cc.ClientCredentials.ClientCertificate.SetCertificate( _
    StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, "cohowinery.com")
    Try
        cc.Open()
        ' Begin using the client.
        Console.WriteLine(cc.Divide(1001, 2))
        cc.Close()
    Catch adExc As AddressAccessDeniedException
        Console.WriteLine(adExc.Message)
        Console.ReadLine()
    Catch exc As System.Exception
        Console.WriteLine(exc.Message)
        Console.ReadLine()
    End Try
    

    Vous pouvez utiliser n'importe lesquelles des énumérations de la classe X509FindType. Le nom du sujet est utilisé ici au cas où le certificat serait modifié (en raison d'une date d'expiration). L'utilisation du nom du sujet permet à l'infrastructure de retrouver le certificat.

Pour spécifier la valeur d'information d'identification du client sur le client dans la configuration

  1. Ajoutez un élément <behavior> à l’élément <behaviors>.

  2. Ajoutez un élément <clientCredentials> à l’élément <behaviors>. Assurez-vous d'affecter à l'attribut name requis une valeur appropriée.

  3. Ajoutez un élément <clientCertificate> à l’élément <clientCredentials>.

  4. Affectez aux attributs suivants des valeurs appropriées : storeLocation, storeName, x509FindType et findValue, comme illustré dans le code suivant. Pour plus d’informations sur les certificats, consultez Utilisation de certificats.

    <behaviors>
       <endpointBehaviors>
          <behavior name="endpointCredentialBehavior">
            <clientCredentials>
              <clientCertificate findValue="Contoso.com"
                                 storeLocation="LocalMachine"
                                 storeName="TrustedPeople"
                                 x509FindType="FindBySubjectName" />
            </clientCredentials>
          </behavior>
       </endpointBehaviors>
    </behaviors>
    
  5. Lorsque vous configurez le client, spécifiez le comportement en définissant l'attribut behaviorConfiguration de l'élément <endpoint>, comme illustré dans le code suivant. L’élément de point de terminaison est un enfant de l’élément <client>. Spécifiez également le nom de la configuration de liaison en affectant à l’attribut bindingConfiguration la liaison pour le client. Si vous utilisez un fichier de configuration généré, le nom de la liaison est généré automatiquement. Dans cet exemple, le nom est "tcpBindingWithCredential".

    <client>
      <endpoint name =""
                address="net.tcp://contoso.com:8036/aloha"
                binding="netTcpBinding"
                bindingConfiguration="tcpBindingWithCredential"
                behaviorConfiguration="endpointCredentialBehavior" />
    </client>
    

Voir aussi