Partager via


Point de terminaison de métadonnées sécurisés personnalisé

L’exemple CustomMexEndpoint montre comment implémenter un service avec un point de terminaison de métadonnées sécurisé qui utilise l’une des liaisons d’échange non de métadonnées et comment configurer l’outil Utilitaire de métadonnées ServiceModel (Svcutil.exe) ou les clients pour extraire les métadonnées à partir d’un tel point de terminaison de métadonnées. Il existe deux liaisons fournies par le système pour exposer des points de terminaison de métadonnées : mexHttpBinding et mexHttpsBinding. mexHttpBinding est utilisé pour exposer un point de terminaison de métadonnées via HTTP de manière non sécurisée. mexHttpsBinding est utilisé pour exposer un point de terminaison de métadonnées via HTTPS de manière sécurisée. Cet exemple montre comment exposer un point de terminaison de métadonnées sécurisé à l’aide du WSHttpBinding. Pour ce faire, vous souhaitez modifier les paramètres de sécurité sur la liaison, mais vous ne souhaitez pas utiliser HTTPS. Si vous utilisez le mexHttpsBinding de votre point de terminaison de métadonnées sera sécurisé, mais il n’existe aucun moyen de modifier les paramètres de liaison.

Remarque

La procédure d’installation et les instructions de génération de cet exemple se trouvent à la fin de cette rubrique.

Service

Le service de cet exemple comporte deux points de terminaison. Le point de terminaison de l’application sert le ICalculator contrat sur un WSHttpBinding contrat avec ReliableSession activation et Message sécurité à l’aide de certificats. Le point de terminaison de métadonnées utilise WSHttpBindingégalement , avec les mêmes paramètres de sécurité, mais sans ReliableSessionaucun . Voici la configuration appropriée :

<services>
    <service name="Microsoft.ServiceModel.Samples.CalculatorService"
             behaviorConfiguration="CalculatorServiceBehavior">
     <!-- use base address provided by host -->
     <endpoint address=""
       binding="wsHttpBinding"
       bindingConfiguration="Binding2"
       contract="Microsoft.ServiceModel.Samples.ICalculator" />
     <endpoint address="mex"
       binding="wsHttpBinding"
       bindingConfiguration="Binding1"
       contract="IMetadataExchange" />
     </service>
 </services>
 <bindings>
   <wsHttpBinding>
     <binding name="Binding1">
       <security mode="Message">
         <message clientCredentialType="Certificate" />
       </security>
     </binding>
     <binding name="Binding2">
       <reliableSession inactivityTimeout="00:01:00" enabled="true" />
       <security mode="Message">
         <message clientCredentialType="Certificate" />
       </security>
     </binding>
   </wsHttpBinding>
 </bindings>

Dans de nombreux autres exemples, le point de terminaison de métadonnées utilise la valeur par défaut mexHttpBinding, ce qui n’est pas sécurisé. Ici, les métadonnées sont sécurisées à Message l’aide WSHttpBinding de la sécurité. Pour que les clients de métadonnées récupèrent ces métadonnées, ils doivent être configurés avec une liaison correspondante. Cet exemple illustre deux clients de ce type.

Le premier client utilise Svcutil.exe pour extraire les métadonnées et générer le code client et la configuration au moment du design. Étant donné que le service utilise une liaison non par défaut pour les métadonnées, l’outil Svcutil.exe doit être spécifiquement configuré afin qu’il puisse obtenir les métadonnées du service à l’aide de cette liaison.

Le deuxième client utilise la MetadataResolver méthode pour extraire dynamiquement les métadonnées d’un contrat connu, puis appeler des opérations sur le client généré dynamiquement.

Client Svcutil

Lorsque vous utilisez la liaison par défaut pour héberger votre IMetadataExchange point de terminaison, vous pouvez exécuter Svcutil.exe avec l’adresse de ce point de terminaison :

svcutil http://localhost/servicemodelsamples/service.svc/mex

et ça marche. Mais dans cet exemple, le serveur utilise un point de terminaison non par défaut pour héberger les métadonnées. Par conséquent, Svcutil.exe devez être invité à utiliser la liaison correcte. Cette opération peut être effectuée à l’aide d’un fichier Svcutil.exe.config.

Le fichier Svcutil.exe.config ressemble à un fichier de configuration client normal. Les seuls aspects inhabituels sont le nom et le contrat du point de terminaison client :

<endpoint name="http"
          binding="wsHttpBinding"
          bindingConfiguration="Binding1"
          behaviorConfiguration="ClientCertificateBehavior"
          contract="IMetadataExchange" />

Le nom du point de terminaison doit être le nom du schéma de l’adresse où les métadonnées sont hébergées et le contrat de point de terminaison doit être IMetadataExchange. Par conséquent, lorsque Svcutil.exe est exécuté avec une ligne de commande, par exemple :

svcutil http://localhost/servicemodelsamples/service.svc/mex

il recherche le point de terminaison nommé « http » et le contrat IMetadataExchange pour configurer la liaison et le comportement de l’échange de communication avec le point de terminaison de métadonnées. Le reste du fichier Svcutil.exe.config dans l’exemple spécifie la configuration de liaison et les informations d’identification de comportement pour correspondre à la configuration du serveur du point de terminaison de métadonnées.

Pour que Svcutil.exe récupère la configuration dans Svcutil.exe.config, Svcutil.exe doit se trouver dans le même répertoire que le fichier de configuration. Par conséquent, vous devez copier Svcutil.exe à partir de son emplacement d’installation vers le répertoire qui contient le fichier Svcutil.exe.config. Ensuite, à partir de ce répertoire, exécutez la commande suivante :

.\svcutil.exe http://localhost/servicemodelsamples/service.svc/mex

Le .\" de début garantit que la copie de Svcutil.exe dans ce répertoire (celle qui a un Svcutil.exe.configcorrespondant) est exécutée.

Client MetadataResolver

Si le client connaît le contrat et comment communiquer avec les métadonnées au moment du design, le client peut rechercher dynamiquement la liaison et l’adresse des points de terminaison d’application à l’aide du MetadataResolver. Cet exemple de client montre comment configurer la liaison et les informations d’identification utilisées en MetadataResolver créant et en configurant un MetadataExchangeClient.

Les mêmes informations de liaison et de certificat qui apparaissent dans Svcutil.exe.config peuvent être spécifiées impérativement sur les MetadataExchangeClientéléments suivants :

// Specify the Metadata Exchange binding and its security mode
WSHttpBinding mexBinding = new WSHttpBinding(SecurityMode.Message);
mexBinding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;

// Create a MetadataExchangeClient for retrieving metadata, and set the // certificate details
MetadataExchangeClient mexClient = new MetadataExchangeClient(mexBinding);
mexClient.SoapCredentials.ClientCertificate.SetCertificate(    StoreLocation.CurrentUser, StoreName.My,
    X509FindType.FindBySubjectName, "client.com");
mexClient.SoapCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust;
mexClient.SoapCredentials.ServiceCertificate.SetDefaultCertificate(    StoreLocation.CurrentUser, StoreName.TrustedPeople,
    X509FindType.FindBySubjectName, "localhost");

Avec la mexClient configuration, nous pouvons énumérer les contrats qui nous intéressent et utiliser MetadataResolver pour récupérer une liste de points de terminaison avec ces contrats :

// The contract we want to fetch metadata for
Collection<ContractDescription> contracts = new Collection<ContractDescription>();
ContractDescription contract = ContractDescription.GetContract(typeof(ICalculator));
contracts.Add(contract);
// Find endpoints for that contract
EndpointAddress mexAddress = new EndpointAddress(ConfigurationManager.AppSettings["mexAddress"]);
ServiceEndpointCollection endpoints = MetadataResolver.Resolve(contracts, mexAddress, mexClient);

Enfin, nous pouvons utiliser les informations de ces points de terminaison pour initialiser la liaison et l’adresse d’un ChannelFactory canal utilisé pour créer des canaux pour communiquer avec les points de terminaison d’application.

ChannelFactory<ICalculator> cf = new ChannelFactory<ICalculator>(endpoint.Binding, endpoint.Address);

Le point clé de cet exemple de client est de démontrer que, si vous utilisez MetadataResolver, et que vous devez spécifier des liaisons ou des comportements personnalisés pour la communication d’échange de métadonnées, vous pouvez utiliser un MetadataExchangeClient pour spécifier ces paramètres personnalisés.

Pour configurer et compiler l’exemple

  1. Assurez-vous d’avoir effectué la Procédure d’installation unique pour les exemples Windows Communication Foundation.

  2. Pour générer la solution, suivez les instructions de Création des exemples Windows Communication Foundation.

Pour exécuter l’exemple sur le même ordinateur

  1. Exécutez Setup.bat à partir de l’exemple de dossier d’installation. Cela installe tous les certificats requis pour l’exécution de l’exemple. Notez que Setup.bat utilise l’outil FindPrivateKey.exe, qui est installé en exécutant setupCertTool.bat à partir de One-Time procédure d’installation pour les exemples Windows Communication Foundation.

  2. Exécutez l’application cliente à partir de \MetadataResolverClient\bin ou \SvcutilClient\bin. L’activité du client s’affiche sur l’application console cliente.

  3. Si le client et le service ne sont pas en mesure de communiquer, consultez Conseils de résolution des problèmes pour les exemples WCF.

  4. Supprimez les certificats en exécutant Cleanup.bat une fois l’exemple terminé. D’autres exemples de sécurité utilisent les mêmes certificats.

Pour exécuter l’exemple sur plusieurs ordinateurs

  1. Sur le serveur, exécutez setup.bat service. L’exécution setup.bat avec l’argument service crée un certificat de service avec le nom de domaine complet de l’ordinateur et exporte le certificat de service vers un fichier nommé Service.cer.

  2. Sur le serveur, modifiez Web.config pour refléter le nouveau nom du certificat. Autrement dit, remplacez l’attribut findValue dans l’élément <serviceCertificate> par le nom de domaine complet de l’ordinateur.

  3. Copiez le fichier Service.cer du répertoire de service vers le répertoire client sur l’ordinateur client.

  4. Sur le client, exécutez setup.bat client. L’exécution setup.bat avec l’argument client crée un certificat client nommé Client.com et exporte le certificat client vers un fichier nommé Client.cer.

  5. Dans le fichier App.config de l’ordinateur MetadataResolverClient client, modifiez la valeur d’adresse du point de terminaison mex pour qu’elle corresponde à la nouvelle adresse de votre service. Pour ce faire, remplacez localhost par le nom de domaine complet du serveur. Remplacez également l’occurrence de « localhost » dans le fichier metadataResolverClient.cs par le nouveau nom de certificat de service (nom de domaine complet du serveur). Faites la même chose pour la App.config du projet SvcutilClient.

  6. Copiez le fichier Client.cer du répertoire client vers le répertoire de service sur le serveur.

  7. Sur le client, exécutez ImportServiceCert.bat. Cela importe le certificat de service à partir du fichier Service.cer dans le magasin CurrentUser - TrustedPeople.

  8. Sur le serveur, exécutez ImportClientCert.bat, cela importe le certificat client à partir du fichier Client.cer dans le magasin LocalMachine - TrustedPeople.

  9. Sur l’ordinateur de service, générez le projet de service dans Visual Studio et sélectionnez la page d’aide dans un navigateur web pour vérifier qu’elle est en cours d’exécution.

  10. Sur l’ordinateur client, exécutez MetadataResolverClient ou SvcutilClient à partir de VS.

    1. Si le client et le service ne sont pas en mesure de communiquer, consultez Conseils de résolution des problèmes pour les exemples WCF.

Pour nettoyer après le test

  • Exécutez Cleanup.bat dans le dossier d’exemples une fois que vous avez terminé d’exécuter l’exemple.

    Remarque

    Ce script ne supprime pas les certificats de service sur un client lors de l’exécution de cet exemple sur plusieurs ordinateurs. Si vous avez exécuté des exemples Windows Communication Foundation (WCF) qui utilisent des certificats sur plusieurs ordinateurs, veillez à effacer les certificats de service installés dans le magasin CurrentUser - TrustedPeople. Pour ce faire, utilisez la commande suivante : certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>. Par exemple : certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com.