Procédure : utiliser la sécurité du transport et des informations d’identification de message

La sécurisation d’un service à l’aide de la sécurité de transport et des informations d’identification de message tire partie des avantages les plus intéressants offerts par ces deux modes de sécurité dans Windows Communication Foundation (WCF). En résumé, la sécurité de la couche de transport assure l'intégrité et la confidentialité des informations tandis que la sécurité de la couche de message offre diverses informations d'identification, lesquelles ne sont pas disponibles lorsque seule la sécurité de niveau transport est utilisée. Cette rubrique contient la procédure par étape permettant d’implémenter la sécurité de transport avec les informations d’identification de message à l’aide des liaisons WSHttpBinding et NetTcpBinding. Pour plus d’informations sur la définition du mode de sécurité, consultez Guide pratique pour définir le mode de sécurité.

Lorsque vous affectez au mode de sécurité la valeur TransportWithMessageCredential, le mécanisme chargé d'offrir la sécurité de niveau transport dépend du transport utilisé. Pour le transport HTTP, le mécanisme utilisé est Secure Sockets Layer (SSL) sur HTTP, c'est-à-dire HTTPS, pour le transport TCP, il s'agit de SSL sur TCP ou de Windows.

Si le transport correspond à HTTP (à l'aide de la liaison WSHttpBinding), la sécurité de niveau transport est assurée par SSL sur HTTP. Dans ce cas, vous devez configurer l’ordinateur hébergeant le service en attribuant un certificat SSL à l’un de ses ports, comme indiqué ci-après dans cette rubrique.

Si le transport correspond à TCP (à l'aide de la liaison NetTcpBinding), la sécurité de niveau transport est assurée par la sécurité Windows ou par SSL sur TCP. Lorsque vous utilisez la sécurité SSL sur TCP, vous devez spécifier le certificat à l'aide de la méthode SetCertificate, comme indiqué ci-après dans cette rubrique.

Pour utiliser la liaison WSHttpBinding avec un certificat pour la sécurité de niveau transport (dans le code)

  1. Utilisez l’outil HttpCfg.exe pour attribuer un certificat SSL à l’un des ports de l’ordinateur. Pour plus d’informations, consultez Guide pratique pour configurer un port avec un certificat SSL.

  2. Créez une instance de la classe WSHttpBinding, puis affectez à la propriété Mode la valeur TransportWithMessageCredential.

  3. Affectez à la propriété ClientCredentialType une valeur appropriée. (Pour plus d’informations, consultez Sélection d’un type d’informations d’identification.) Le code suivant utilise la valeur Certificate.

  4. Créez une instance de la classe Uri en utilisant une adresse de base appropriée. Remarque : cette adresse doit utiliser le schéma HTTPS et contenir le véritable nom de l’ordinateur ainsi que le numéro de port auquel le certificat SSL a été attribué. Vous pouvez également définir l'adresse de base dans la configuration.

  5. Ajoutez un point de terminaison de service à l'aide de la méthode AddServiceEndpoint.

  6. Créez une instance de ServiceHost, puis appelez la méthode Open, comme illustré dans l'exemple de code suivant.

    WSHttpBinding b = new WSHttpBinding();
    b.Security.Mode = SecurityMode.TransportWithMessageCredential;
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    
    // The SSL certificate is bound to port 8006 using the HttpCfg.exe tool.
    Uri httpsAddress = new Uri("https://localMachineName:8006/base");
    ServiceHost sh = new ServiceHost(typeof(Calculator), httpsAddress);
    sh.AddServiceEndpoint(typeof(ICalculator), b, "HttpsCalculator");
    sh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    
    Dim b As New WSHttpBinding()
    b.Security.Mode = SecurityMode.TransportWithMessageCredential
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
    
    ' The SSL certificate is bound to port 8006 using the HttpCfg.exe tool.
    Dim httpsAddress As New Uri("https://localMachineName:8006/base")
    Dim sh As New ServiceHost(GetType(Calculator), httpsAddress)
    sh.AddServiceEndpoint(GetType(ICalculator), b, "HttpsCalculator")
    sh.Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    

Pour utiliser la liaison NetTcpBinding avec un certificat pour la sécurité de niveau transport (dans le code)

  1. Créez une instance de la classe NetTcpBinding, puis affectez à la propriété Mode la valeur TransportWithMessageCredential.

  2. Affectez à la propriété ClientCredentialType une valeur appropriée. Dans l'exemple de code suivant, la valeur Certificate est utilisée.

  3. Créez une instance de la classe Uri en utilisant une adresse de base appropriée. Remarque : cette adresse doit utiliser le schéma « net.tcp ». Vous pouvez également définir l'adresse de base dans la configuration.

  4. Créez une instance de la classe ServiceHost.

  5. Utilisez la méthode SetCertificate de la classe X509CertificateRecipientServiceCredential pour définir de manière explicite le certificat X.509 de ce service.

  6. Ajoutez un point de terminaison de service à l'aide de la méthode AddServiceEndpoint.

  7. Appelez la méthode Open, comme illustré dans le code suivant :

    NetTcpBinding b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential);
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    Uri netTcpAddress = new Uri("net.tcp://baseAddress");
    ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAddress);
    sh.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine, StoreName.My,
        X509FindType.FindByIssuerName, "Contoso.com");
    sh.AddServiceEndpoint(typeof(ICalculator), b, "TcpCalculator");
    sh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    
    Dim b As New NetTcpBinding(SecurityMode.TransportWithMessageCredential)
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
    Dim netTcpAddress As New Uri("net.tcp://baseAddress")
    Dim sh As New ServiceHost(GetType(Calculator), netTcpAddress)
    sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByIssuerName, "Contoso.com")
    sh.AddServiceEndpoint(GetType(ICalculator), b, "TcpCalculator")
    sh.Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    

Pour utiliser la liaison NetTcpBinding avec Windows comme sécurité de transport (dans le code)

  1. Créez une instance de la classe NetTcpBinding, puis affectez à la propriété Mode la valeur TransportWithMessageCredential.

  2. Configurez la sécurité de transport sur Windows en affectant à la propriété ClientCredentialType la valeur Windows. Remarque : il s'agit de la valeur par défaut.

  3. Affectez à la propriété ClientCredentialType une valeur appropriée. Dans l'exemple de code suivant, la valeur Certificate est utilisée.

  4. Créez une instance de la classe Uri en utilisant une adresse de base appropriée. Remarque : cette adresse doit utiliser le schéma « net.tcp ». Vous pouvez également définir l'adresse de base dans la configuration.

  5. Créez une instance de la classe ServiceHost.

  6. Utilisez la méthode SetCertificate de la classe X509CertificateRecipientServiceCredential pour définir de manière explicite le certificat X.509 de ce service.

  7. Ajoutez un point de terminaison de service à l'aide de la méthode AddServiceEndpoint.

  8. Appelez la méthode Open, comme illustré dans le code suivant :

    NetTcpBinding b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential);
    b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    Uri netTcpAddress = new Uri("net.tcp://Tcp");
    ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAddress);
    sh.Credentials.ServiceCertificate.SetCertificate(
        StoreLocation.LocalMachine, StoreName.My,
        X509FindType.FindByIssuerName, "Contoso.com");
    sh.AddServiceEndpoint(typeof(ICalculator), b, "TcpCalculator");
    sh.Open();
    Console.WriteLine("Listening");
    Console.ReadLine();
    
    Dim b As New NetTcpBinding(SecurityMode.TransportWithMessageCredential)
    b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate
    Dim netTcpAddress As New Uri("net.tcp://Tcp")
    Dim sh As New ServiceHost(GetType(Calculator), netTcpAddress)
    sh.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByIssuerName, "Contoso.com")
    sh.AddServiceEndpoint(GetType(ICalculator), b, "TcpCalculator")
    sh.Open()
    Console.WriteLine("Listening")
    Console.ReadLine()
    

Utilisation de la configuration

Pour utiliser la liaison WSHttpBinding

  1. Configurez l’ordinateur en attribuant un certificat SSL à l’un de ses ports. (Pour plus d’informations, consultez Guide pratique pour configurer un port avec un certificat SSL.) Avec cette configuration, vous n’avez pas besoin de définir une valeur d’élément <transport>.

  2. Spécifiez le type d'informations d'identification pour la sécurité de niveau message. L’exemple suivant définit l’attribut clientCredentialType de l’élément <message> sur UserName.

    <wsHttpBinding>  
    <binding name="WsHttpBinding_ICalculator">  
            <security mode="TransportWithMessageCredential" >  
               <message clientCredentialType="UserName" />  
            </security>  
    </binding>  
    </wsHttpBinding>  
    

Pour utiliser la liaison NetTcpBinding avec un certificat pour la sécurité de transport

  1. Pour la sécurité SSL sur TCP, vous devez spécifier de manière explicite le certificat dans l'élément <behaviors>. Dans l'exemple suivant, le certificat spécifié est publié par un émetteur figurant dans l'emplacement de magasin par défaut (ordinateur local et magasins personnels).

    <behaviors>  
     <serviceBehaviors>  
       <behavior name="mySvcBehavior">  
           <serviceCredentials>  
             <serviceCertificate findValue="contoso.com"  
                                 x509FindType="FindByIssuerName" />  
           </serviceCredentials>  
       </behavior>  
     </serviceBehaviors>  
    </behaviors>  
    
  2. Ajouter une <netTcpBinding> à la section des liaisons

  3. Ajoutez un élément de liaison, puis affectez à l’attribut name une valeur adéquate.

  4. Ajoutez un élément <security>, puis affectez à l’attribut mode la valeur TransportWithMessageCredential.

  5. Ajoutez un élément <message>, puis affectez à l’attribut clientCredentialType une valeur appropriée.

    <bindings>  
    <netTcpBinding>  
      <binding name="myTcpBinding">  
        <security mode="TransportWithMessageCredential" >  
           <message clientCredentialType="Windows" />  
        </security>  
      </binding>  
    </netTcpBinding>  
    </bindings>  
    

Pour utiliser la liaison NetTcpBinding avec Windows comme sécurité de transport

  1. Ajoutez une <netTcpBinding> à la section des liaisons,

  2. Ajoutez un élément <binding>, puis affectez à l’attribut name une valeur appropriée.

  3. Ajoutez un élément <security>, puis affectez à l’attribut mode la valeur TransportWithMessageCredential.

  4. Ajoutez un élément <transport>, puis affectez à l’attribut clientCredentialType la valeur Windows.

  5. Ajoutez un élément <message>, puis affectez à l’attribut clientCredentialType une valeur appropriée. Dans l'exemple de code suivant, un certificat est affecté à la valeur.

    <bindings>  
    <netTcpBinding>  
      <binding name="myTcpBinding">  
        <security mode="TransportWithMessageCredential" >  
           <transport clientCredentialType="Windows" />  
           <message clientCredentialType="Certificate" />  
        </security>  
      </binding>  
    </netTcpBinding>  
    </bindings>  
    

Voir aussi