Sécurisation des clients

Dans Windows Communication Foundation (WCF), le service dicte les conditions de sécurité pour les clients. Autrement dit, le service spécifie quel mode de sécurité utiliser, et si le client doit fournir ou non une information d'identification. Le processus de la sécurisation d'un client, par conséquent, est simple : utilisez les métadonnées obtenues depuis le service (s'il est publié) et générez un client. Les métadonnées spécifient comment configurer le client. Si le service exige que le client fournisse une information d'identification, vous devez obtenir une information d'identification qui correspond à la spécification. Cette rubrique traite en détail de ce processus. Pour plus d'informations sur le sujet suivant la création d'un service sécurisé, consultez Sécurisation de services.

Le service spécifie la sécurité

Par défaut, les fonctionnalités de sécurité des liaisons WCF sont activées. (Exception : BasicHttpBinding.) Par conséquent, si le service a été créé à l'aide de WCF, il est plus probable qu'il implémente la sécurité pour garantir l'identification, la confidentialité et l'intégrité. Dans ce cas, les métadonnées que le service fournit indiqueront ce qu'il faut pour établir un canal de communication sécurisé. Si les métadonnées du service n'incluent pas de conditions de sécurité, il n'y a aucun moyen d'imposer une méthode de sécurité, telle que SSL (Secure Sockets Layer) sur HTTP, sur un service. Toutefois, si le service exige que le client fournisse une information d'identification, le développeur, le responsable du déploiement ou l'administrateur client doit fournir l'information d'identification réelle que le client utilisera pour s'identifier auprès du service.

Obtention des métadonnées

Lors de la création d'un client, la première étape est d'obtenir les métadonnées pour le service avec lequel le client communiquera. Cette opération peut être effectuée de deux façons. En premier lieu, si le service publie un point de terminaison d'échange de métadonnées (MEX) ou rend ses métadonnées disponibles sur HTTP ou HTTPS, vous pouvez télécharger les métadonnées à l'aide de Outil Service Model Metadata Tool (Svcutil.exe), qui génère à la fois des fichiers de code pour un client ainsi qu'un fichier de configuration. (Pour plus d'informations sur le sujet suivant l'utilisation de l'outil, consultez Accès aux services à l'aide d'un client WCF.) Si le service ne publie pas de point de terminaison MEX et ne rend pas ses métadonnées disponibles sur HTTP ou HTTPS, vous devez contacter le créateur du service pour obtenir la documentation qui décrit les conditions de sécurité et les métadonnées.

ms731094.Important(fr-fr,VS.100).gif Remarque :
Il est recommandé de vérifier que les métadonnées proviennent d'une source fiable et qu'elles n'ont pas été falsifiées. Les métadonnées récupérées à l'aide du protocole HTTP sont envoyées en texte clair et peuvent être falsifiées. Si le service utilise les propriétés HttpsGetEnabled et HttpsGetUrl, utilisez l'URL que le créateur du service vous a fournie pour télécharger les données à l'aide du protocole HTTPS.

Validation de la sécurité

Les sources de métadonnées peuvent être divisées en deux catégories principales : les sources fiables et les sources non fiables. Si vous faites confiance à une source et avez téléchargé le code client et d'autres métadonnées depuis le point de terminaison MEX sécurisé de cette source, vous pouvez générer le client, lui fournir les informations d'identification correctes et l'exécuter sans inquiétude.

Toutefois, si vous choisissez de télécharger un client et des métadonnées à partir d'une source dont vous savez peu de choses, veillez à valider les mesures de sécurité que le code utilise. Par exemple, vous ne devez pas créer un client qui envoie vos informations personnelles ou financières à un service à moins que le service n'exige confidentialité et intégrité (au strict minimum). Vous devez faire confiance au propriétaire du service au point d'être disposé à lui divulguer de telles informations car elles seront visibles par le propriétaire.

En règle générale, lorsque vous utilisez du code et des métadonnées provenant d'une source non fiable, vérifiez le code et métadonnées pour vous assurer qu'ils répondent au niveau de sécurité exigé.

Définition de l'information d'identification d'un client

La définition de l'information d'identification d'un client s'effectue en deux étapes :

  1. Déterminez le type d'information d'identification du client que le service requiert. Pour cela, vous avez le choix entre deux méthodes. En premier lieu, si vous disposez de la documentation du créateur du service, celle-ci doit spécifier le type d'information d'identification du client (le cas échéant) que le service requiert. En second lieu, si vous disposez uniquement d'un fichier de configuration généré par l'outil Svcutil.exe, vous pouvez examiner les liaisons individuelles pour déterminer quel type d'information d'identification est requis.

  2. Spécifiez l'information d'identification effective du client. L'information d'identification effective du client est appelée valeur d'information d'identification du client pour la distinguer du type. Par exemple, si le type d'information d'identification du client spécifie un certificat, vous devez fournir un certificat X.509 publié par une autorité de certification que le service approuve.

Détermination du type d'information d'identification du client

Si vous disposez du fichier de configuration que l'outil Svcutil.exe a généré, examinez la section <bindings> pour déterminer quel type d'information d'identification du client est requis. Dans la section, des éléments de liaison spécifient les conditions de sécurité. Examinez en particulier l'élément <sécurité> de chaque de liaison. Cet élément inclut l'attribut mode, auquel vous pouvez affecter l'une de trois valeurs possibles (Message, Transport ou TransportWithMessageCredential). La valeur de l'attribut détermine le mode, et le mode détermine quel élément enfant est significatif.

L'élément <security> peut ou contenir un élément <transport> ou <message> , ou les deux. L'élément significatif est celui qui correspond au mode de sécurité. Par exemple, le code suivant spécifie que le mode de sécurité est "Message", et le type d'information d'identification du client pour l'élément <message> est "Certificate". Dans ce cas, l'élément <transport> peut être ignoré. Toutefois, l'élément <message> spécifie qu'un certificat X.509 doit être fourni.

<wsHttpBinding>
    <binding name="WSHttpBinding_ICalculator">
       <security mode="Message">
           <transport clientCredentialType="Windows" 
                      realm="" />
           <message clientCredentialType="Certificate" 
                    negotiateServiceCredential="true"
                    algorithmSuite="Default" 
                    establishSecurityContext="true" />
       </security>
    </binding>
</wsHttpBinding>

Notez que si l'attribut clientCredentialType a la valeur "Windows", comme dans l'exemple suivant, vous n'avez pas besoin de fournir une valeur d'information d'identification effective. Cela est dû au fait que la sécurité intégrée de Windows fournit l'information d'identification effective (un jeton Kerberos) de la personne qui exécute le client.

<security mode="Message">
    <transport clientCredentialType="Windows " 
        realm="" />
</security>

Définition de la valeur d'information d'identification du client

S'il est déterminé que le client doit fournir une information d'identification, utilisez la méthode appropriée pour configurer le client. Par exemple, pour définir un certificat client, utilisez la méthode SetCertificate.

Le certificat X.509 est une forme courante d'information d'identification. Vous pouvez fournir l'information d'identification de deux manières :

  • En la programmant dans votre code client (à l'aide de la méthode SetCertificate).

En ajoutant une section <behaviors> du fichier de configuration pour le client et en utilisant l'élément clientCredentials (illustré ci-dessous).

Définition d'une valeur <clientCredentials> dans du code

Pour définir une valeur <clientCredentials> dans du code, vous devez accéder à la propriété ClientCredentials de la classe ClientBase. La propriété retourne un objet ClientCredentials qui autorise l'accès à différents types d'informations d'identification, comme le montre le tableau suivant.

Propriété ClientCredential Description Remarques

ClientCertificate

Retourne un X509CertificateInitiatorClientCredential.

Représente un certificat X.509 fourni par le client pour s'identifier auprès du service.

HttpDigest

Retourne un HttpDigestClientCredential.

Représente une information d'identification HTTP Digest. L'information d'identification est un hachage du nom d'utilisateur et du mot de passe.

IssuedToken

Retourne un IssuedTokenClientCredential.

Représente un jeton de sécurité personnalisé publié par un service de jeton de sécurité, utilisé communément dans les scénarios de fédération.

Peer

Retourne un PeerCredential.

Représente une information d'identification homologue pour la participation à une maille homologue sur un domaine Windows.

ServiceCertificate

Retourne un X509CertificateRecipientClientCredential.

Représente un certificat X.509 fourni par le service dans une négociation hors bande.

UserName

Retourne un UserNamePasswordClientCredential.

Représente une paire nom d'utilisateur/mot de passe.

Windows

Retourne un WindowsClientCredential.

Représente une information d'identification du client Windows (une information d'identification Kerberos). Les propriétés de la classe sont en lecture seule.

Définition d'une valeur <clientCredentials> dans la configuration

Les valeurs d'information d'identification sont spécifiées en utilisant un comportement de point de terminaison en tant qu'élément enfant de l'élément <clientCredentials>. L'élément utilisé dépend du type d'information d'identification du client. L'exemple suivant illustre la configuration pour définir un certificat X.509 à l'aide de <clientCertificate> of <clientCredentials> Element.

<configuration>
  <system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="myEndpointBehavior">
          <clientCredentials>
            <clientCertificate findvalue="myMachineName" 
            storeLocation="Current" X509FindType="FindBySubjectName" />
          </clientCredentials>
        </behavior>            
    </behaviors>
  </system.serviceModel>
</configuration>

Pour définir l'information d'identification du client dans la configuration, ajoutez un élément <endpointBehaviors> au fichier de configuration. En outre, l'élément de comportement ajouté doit être lié au point de terminaison du service à l'aide de l'attribut behaviorConfiguration de l'élément <endpoint> comme le montre l'exemple suivant. La valeur de l'attribut behaviorConfiguration doit correspondre à la valeur de l'attribut de comportement name.

<configuration>

<system.serviceModel>

<client>

<endpoint address="https://localhost/servicemodelsamples/service.svc"

binding="wsHttpBinding"

bindingConfiguration="Binding1"

behaviorConfiguration="myEndpointBehavior"

contract="Microsoft.ServiceModel.Samples.ICalculator" />

</client>

</system.serviceModel>

</configuration>

ms731094.note(fr-fr,VS.100).gifRemarque :
Certaines des valeurs d'information d'identification du client ne peuvent pas être définies à l'aide des fichiers de configuration de l'application, par exemple le nom d'utilisateur et le mot de passe, ou les valeurs d'utilisateur et de mot de passe Windows. Ces valeurs d'information d'identification peuvent être spécifiées dans du code uniquement.

Pour plus d'informations sur le sujet suivant la définition de l'information d'identification du client, consultez Comment : spécifier des valeurs d'informations d'identification du client.

ms731094.note(fr-fr,VS.100).gifRemarque :
ClientCredentialType est ignoré lorsque SecurityMode a la valeur "TransportWithMessageCredential", comme le montre l'exemple de configuration suivant.

<wsHttpBinding>
    <binding name="PingBinding">
        <security mode="TransportWithMessageCredential"  >
           <message  clientCredentialType="UserName" 
               establishSecurityContext="false"  
               negotiateServiceCredential="false" />
           <transport clientCredentialType="Certificate"  />
         </security>
    </binding>
</wsHttpBinding>

Voir aussi

Tâches

Comment : spécifier des valeurs d'informations d'identification du client
Comment : spécifier le type d'informations d'identification du client

Référence

ClientCredentials
ClientBase
ClientCredentials
HttpsGetEnabled
HttpsGetUrl

Concepts

Outil Éditeur de configuration (SvcConfigEditor.exe)
Sécurisation de services
Accès aux services à l'aide d'un client WCF
Outil Service Model Metadata Tool (Svcutil.exe)

Autres ressources

<bindings>