Partager via


Procédure : sécuriser des points de terminaison de métadonnées

Les métadonnées d'un service peuvent contenir des informations sensibles sur votre application dont un utilisateur malveillant peut tirer parti. Les consommateurs de votre service peuvent également avoir besoin d'un mécanisme sécurisé pour obtenir des métadonnées sur votre service. Par conséquent, il est parfois nécessaire de publier vos métadonnées à l'aide d'un point de terminaison sécurisé.

Les points de terminaison de métadonnées sont en général sécurisés à l’aide des mécanismes de sécurité standard définis dans Windows Communication Foundation (WCF) pour la sécurisation des points de terminaison d’application. Pour plus d’informations, consultez Vue d’ensemble de la sécurité.

Cette rubrique présente en détail les étapes permettant de créer un point de terminaison sécurisé par un certificat SSL (Secure Sockets Layer) ou, en d'autres termes, un point de terminaison HTTPS.

Pour créer un point de terminaison sécurisé de métadonnées HTTPS GET dans le code

  1. Configurez un port avec un certificat X.509 approprié. Le certificat doit provenir d’une autorité de confiance, et son utilisation prévue doit être « Autorisation de service ». Vous devez utiliser l’outil HttpCfg.exe pour joindre le certificat au port. Consultez Comment : Configurer un port avec un certificat SSL.

    Important

    Le sujet du certificat ou son nom DNS (Domain Name System) doit correspondre au nom de l'ordinateur. Ceci est essentiel car l'une des premières étapes effectuées par le mécanisme HTTPS est de vérifier que le certificat est émis vers le même URI (Uniform Resource Identifier) que l'adresse avec laquelle il est appelé.

  2. Créez une nouvelle instance de la classe ServiceMetadataBehavior.

  3. Affectez la valeur HttpsGetEnabled à la propriété ServiceMetadataBehavior de la classe true.

  4. Affectez une URL appropriée à la propriété HttpsGetUrl. Notez que, si vous spécifiez une adresse absolue, l’URL doit commencer par https://. Si vous spécifiez une adresse relative, vous devez fournir une adresse de base HTTPS pour votre hôte de service. Si cette propriété n'est pas définie, l'adresse par défaut est "" ou directement l'adresse de base HTTPS pour le service.

  5. Ajoutez l’instance à la collection de comportements que la propriété Behaviors de la classe ServiceDescription retourne, comme l’illustre le code ci-dessous.

    // Create a new metadata behavior object and set its properties to
    // create a secure endpoint.
    ServiceMetadataBehavior sb = new ServiceMetadataBehavior();
    sb.HttpsGetEnabled = true;
    sb.HttpsGetUrl = new Uri("https://myMachineName:8036/myEndpoint");
    myServiceHost.Description.Behaviors.Add(sb);
    
    myServiceHost.Open();
    
    ' Create a new metadata behavior object and set its properties to 
    ' create a secure endpoint. 
    Dim sb As New ServiceMetadataBehavior()
    
    With sb
        .HttpsGetEnabled = True
        .HttpsGetUrl = New Uri("https://myMachineName:8036/myEndpoint")
    End With
    
    With myServiceHost
        .Description.Behaviors.Add(sb)
        .Open()
    End With
    

Pour créer un point de terminaison sécurisé de métadonnées HTTPS GET dans la configuration

  1. Ajoutez un élément <behaviors> à l’élément <system.serviceModel> du fichier de configuration pour votre service.

  2. Ajoutez un élément <serviceBehaviors> à l’élément <behaviors>.

  3. Ajoutez un élément <behaviors> à l’élément <serviceBehaviors>.

  4. Affectez une valeur appropriée à l'attribut name de l'élément <behavior>. L'attribut name est obligatoire. L'exemple ci-dessous utilise la valeur mySvcBehavior.

  5. Ajoutez un élément <serviceMetadata> à l’élément <behavior>.

  6. Affectez à l'attribut httpsGetEnabled de l'élément <serviceMetadata> la valeur true.

  7. Affectez une valeur appropriée à l'attribut httpsGetUrl de l'élément <serviceMetadata>. Notez que, si vous spécifiez une adresse absolue, l’URL doit commencer par https://. Si vous spécifiez une adresse relative, vous devez fournir une adresse de base HTTPS pour votre hôte de service. Si cette propriété n'est pas définie, l'adresse par défaut est "" ou directement l'adresse de base HTTPS pour le service.

  8. Pour utiliser le comportement avec un service, affectez la valeur de l’attribut name de l’élément behavior à l’attribut behaviorConfiguration de l’élément <service>. Le code de configuration ci-dessous illustre un exemple complet.

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
     <system.serviceModel>
      <behaviors>
       <serviceBehaviors>
        <behavior name="mySvcBehavior">
         <serviceMetadata httpsGetEnabled="true"
              httpsGetUrl="https://localhost:8036/calcMetadata" />
        </behavior>
       </serviceBehaviors>
      </behaviors>
     <services>
      <service behaviorConfiguration="mySvcBehavior"
            name="Microsoft.Security.Samples.Calculator">
       <endpoint address="http://localhost:8037/ServiceModelSamples/calculator"
       binding="wsHttpBinding" bindingConfiguration=""
       contract="Microsoft.Security.Samples.ICalculator" />
      </service>
     </services>
    </system.serviceModel>
    </configuration>
    

Exemple

L'exemple ci-dessous crée une instance d'une classe ServiceHost et ajoute un point de terminaison. Le code crée ensuite une instance de la classe ServiceMetadataBehavior et définit les propriétés pour créer un point d'échange de métadonnées sécurisé.

WSHttpBinding myBinding = new WSHttpBinding();
myBinding.Security.Mode = SecurityMode.Message;
myBinding.Security.Message.ClientCredentialType =
    MessageCredentialType.Windows;

// Create the Type instances for later use and the URI for
// the base address.
Type contractType = typeof(ICalculator);
Type serviceType = typeof(Calculator);
Uri baseAddress = new
    Uri("http://localhost:8037/serviceModelSamples/");

// Create the ServiceHost and add an endpoint.
ServiceHost myServiceHost =
    new ServiceHost(serviceType, baseAddress);
myServiceHost.AddServiceEndpoint
    (contractType, myBinding, "secureCalculator");
// Create a new metadata behavior object and set its properties to
// create a secure endpoint.
ServiceMetadataBehavior sb = new ServiceMetadataBehavior();
sb.HttpsGetEnabled = true;
sb.HttpsGetUrl = new Uri("https://myMachineName:8036/myEndpoint");
myServiceHost.Description.Behaviors.Add(sb);

myServiceHost.Open();
// Use the GetHostEntry method to return the actual machine name.
string machineName = System.Net.Dns.GetHostEntry("").HostName ;
Console.WriteLine("Listening @ {0}:8037/serviceModelSamples/", machineName);
Console.WriteLine("Press Enter to close the service");
Console.ReadLine();
myServiceHost.Close();
Dim myBinding As New WSHttpBinding()
With myBinding.Security
    .Mode = SecurityMode.Message
    .Message.ClientCredentialType = MessageCredentialType.Windows
End With

' Create the Type instances for later use and the URI for 
' the base address.
Dim contractType = GetType(ICalculator)
Dim serviceType = GetType(Calculator)
Dim baseAddress As New Uri("http://localhost:8037/serviceModelSamples/")

' Create the ServiceHost and add an endpoint. 
Dim myServiceHost As New ServiceHost(serviceType, baseAddress)
myServiceHost.AddServiceEndpoint(contractType, myBinding, "secureCalculator")

' Create a new metadata behavior object and set its properties to 
' create a secure endpoint. 
Dim sb As New ServiceMetadataBehavior()

With sb
    .HttpsGetEnabled = True
    .HttpsGetUrl = New Uri("https://myMachineName:8036/myEndpoint")
End With

With myServiceHost
    .Description.Behaviors.Add(sb)
    .Open()
End With

' Use the GetHostEntry method to return the actual machine name.
Dim machineName = System.Net.Dns.GetHostEntry("").HostName
Console.WriteLine("Listening @ {0}:8037/serviceModelSamples/", machineName)
Console.WriteLine("Press Enter to close the service")
Console.ReadLine()
myServiceHost.Close()

Compilation du code

L'exemple de code utilise les espaces de noms suivants :

Voir aussi