Comment : utiliser des informations d'identification de sécurité de transport et de messageHow to: Use Transport Security and Message Credentials

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)Windows Communication Foundation (WCF).Securing a service with both transport and message credentials uses the best of both Transport and Message security modes in Windows Communication Foundation (WCF)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.In sum, transport-layer security provides integrity and confidentiality, while message-layer security provides a variety of credentials that are not possible with strict transport security mechanisms. 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.This topic shows the basic steps for implementing transport with message credentials using the WSHttpBinding and NetTcpBinding bindings. Pour plus d’informations sur la définition du mode de sécurité, consultez Comment : définir le Mode de sécurité.For more information about setting the security mode, see How to: Set the Security Mode.

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é.When setting the security mode to TransportWithMessageCredential, the transport determines the actual mechanism that provides the transport-level security. 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.For HTTP, the mechanism is Secure Sockets Layer (SSL) over HTTP (HTTPS); for TCP, it is SSL over TCP or 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.If the transport is HTTP (using the WSHttpBinding), SSL over HTTP provides the transport-level security. 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.In that case, you must configure the computer hosting the service with an SSL certificate bound to a port, as shown later in this topic.

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.If the transport is TCP (using the NetTcpBinding), by default the transport-level security provided is Windows security, or SSL over 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.When using SSL over TCP, you must specify the certificate using the SetCertificate method, as shown later in this topic.

Pour utiliser la liaison WSHttpBinding avec un certificat pour la sécurité de niveau transport (dans le code)To use the WSHttpBinding with a certificate for transport security (in code)

  1. Utilisez l’outil HttpCfg.exe pour attribuer un certificat SSL à l’un des ports de l’ordinateur.Use the HttpCfg.exe tool to bind an SSL certificate to a port on the machine. Pour plus d’informations, consultez Comment : configurer un Port avec un certificat SSL.For more information, see How to: Configure a Port with an SSL Certificate.

  2. Créez une instance de la classe WSHttpBinding, puis affectez à la propriété Mode la valeur TransportWithMessageCredential.Create an instance of the WSHttpBinding class and set the Mode property to TransportWithMessageCredential.

  3. Affectez à la propriété ClientCredentialType une valeur appropriée.Set the ClientCredentialType property to an appropriate value. (Pour plus d’informations, consultez sélection d’un Type d’informations d’identification.) Dans l'exemple de code suivant, la valeur Certificate est utilisée.(For more information, see Selecting a Credential Type.) The following code uses the Certificate value.

  4. Créez une instance de la classe Uri en utilisant une adresse de base appropriée.Create an instance of the Uri class with an appropriate base address. 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é.Note that the address must use the "HTTPS" scheme and must contain the actual name of the machine and the port number that the SSL certificate is bound to. Vous pouvez également définir l'adresse de base dans la configuration.(Alternatively, you can set the base address in configuration.)

  5. Ajoutez un point de terminaison de service à l'aide de la méthode AddServiceEndpoint.Add a service endpoint using the AddServiceEndpoint method.

  6. Créez une instance de ServiceHost, puis appelez la méthode Open, comme illustré dans l'exemple de code suivant.Create the instance of the ServiceHost and call the Open method, as shown in the following code.

    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)To use the NetTcpBinding with a certificate for transport security (in code)

  1. Créez une instance de la classe NetTcpBinding, puis affectez à la propriété Mode la valeur TransportWithMessageCredential.Create an instance of the NetTcpBinding class and set the Mode property to TransportWithMessageCredential.

  2. Affectez à la propriété ClientCredentialType une valeur appropriée.Set the ClientCredentialType to an appropriate value. Dans l'exemple de code suivant, la valeur Certificate est utilisée.The following code uses the Certificate value.

  3. Créez une instance de la classe Uri en utilisant une adresse de base appropriée.Create an instance of the Uri class with an appropriate base address. Remarque : cette adresse doit utiliser le schéma « net.tcp ».Note that the address must use the "net.tcp" scheme. Vous pouvez également définir l'adresse de base dans la configuration.(Alternatively, you can set the base address in configuration.)

  4. Créez une instance de la classe ServiceHost.Create the instance of the ServiceHost class.

  5. Utilisez la méthode SetCertificate de la classe X509CertificateRecipientServiceCredential pour définir de manière explicite le certificat X.509 de ce service.Use the SetCertificate method of the X509CertificateRecipientServiceCredential class to explicitly set the X.509 certificate for the service.

  6. Ajoutez un point de terminaison de service à l'aide de la méthode AddServiceEndpoint.Add a service endpoint using the AddServiceEndpoint method.

  7. Appelez la méthode Open, comme illustré dans le code suivant :Call the Open method, as shown in the following code.

    NetTcpBinding b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential);
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    Uri netTcpAdddress = new Uri("net.tcp://baseAddress");
    ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAdddress);
    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 netTcpAdddress As New Uri("net.tcp://baseAddress")
    Dim sh As New ServiceHost(GetType(Calculator), netTcpAdddress)
    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)To use the NetTcpBinding with Windows for transport security (in code)

  1. Créez une instance de la classe NetTcpBinding, puis affectez à la propriété Mode la valeur TransportWithMessageCredential.Create an instance of the NetTcpBinding class and set the Mode property to TransportWithMessageCredential.

  2. Configurez la sécurité de transport sur Windows en affectant à la propriété ClientCredentialType la valeur Windows.Set the transport security to use Windows by setting the ClientCredentialType to Windows. Remarque : il s'agit de la valeur par défaut.(Note that this is the default.)

  3. Affectez à la propriété ClientCredentialType une valeur appropriée.Set the ClientCredentialType to an appropriate value. Dans l'exemple de code suivant, la valeur Certificate est utilisée.The following code uses the Certificate value.

  4. Créez une instance de la classe Uri en utilisant une adresse de base appropriée.Create an instance of the Uri class with an appropriate base address. Remarque : cette adresse doit utiliser le schéma « net.tcp ».Note that the address must use the "net.tcp" scheme. Vous pouvez également définir l'adresse de base dans la configuration.(Alternatively, you can set the base address in configuration.)

  5. Créez une instance de la classe ServiceHost.Create the instance of the ServiceHost class.

  6. Utilisez la méthode SetCertificate de la classe X509CertificateRecipientServiceCredential pour définir de manière explicite le certificat X.509 de ce service.Use the SetCertificate method of the X509CertificateRecipientServiceCredential class to explicitly set the X.509 certificate for the service.

  7. Ajoutez un point de terminaison de service à l'aide de la méthode AddServiceEndpoint.Add a service endpoint using the AddServiceEndpoint method.

  8. Appelez la méthode Open, comme illustré dans le code suivant :Call the Open method, as shown in the following code.

    NetTcpBinding b = new NetTcpBinding(SecurityMode.TransportWithMessageCredential);
    b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
    b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
    Uri netTcpAdddress = new Uri("net.tcp://Tcp");
    ServiceHost sh = new ServiceHost(typeof(Calculator), netTcpAdddress);
    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 netTcpAdddress As New Uri("net.tcp://Tcp")
    Dim sh As New ServiceHost(GetType(Calculator), netTcpAdddress)
    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 configurationUsing Configuration

Pour utiliser la liaison WSHttpBindingTo use the WSHttpBinding

  1. Configurez l’ordinateur en attribuant un certificat SSL à l’un de ses ports.Configure the computer with an SSL certificate bound to a port. (Pour plus d’informations, consultez Comment : configurer un Port avec un certificat SSL).(For more information, see How to: Configure a Port with an SSL Certificate). Vous n’avez pas besoin de définir un <transport> valeur de l’élément avec cette configuration.You do not need to set a <transport> element value with this configuration.

  2. Spécifiez le type d'informations d'identification pour la sécurité de niveau message.Specify the client credential type for the message-level security. L’exemple suivant définit la clientCredentialType attribut de la <message> élément UserName.The following example sets the clientCredentialType attribute of the <message> element to 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 transportTo use the NetTcpBinding with a certificate for transport security

  1. Pour la sécurité SSL sur TCP, vous devez spécifier de manière explicite le certificat dans l'élément <behaviors>.For SSL over TCP, you must explicitly specify the certificate in the <behaviors> element. 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).The following example specifies a certificate by its issuer in the default store location (local machine and personal stores).

    <behaviors>  
     <serviceBehaviors>  
       <behavior name="mySvcBehavior">  
           <serviceCredentials>  
             <serviceCertificate findValue="contoso.com"  
                                 x509FindType="FindByIssuerName" />  
           </serviceCredentials>  
       </behavior>  
     </serviceBehaviors>  
    </behaviors>  
    
  2. Ajouter un <netTcpBinding > à la section des liaisonsAdd a <netTcpBinding> to the bindings section

  3. Ajoutez un élément de liaison, puis affectez à l'attribut name une valeur adéquate.Add a binding element, and set the name attribute to an appropriate value.

  4. Ajouter un <security> et affectez le mode attribut TransportWithMessageCredential.Add a <security> element, and set the mode attribute to TransportWithMessageCredential.

  5. Ajouter un <message> et affectez le clientCredentialType attribut une valeur appropriée.Add a <message> element, and set the clientCredentialType attribute to an appropriate value.

    <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 transportTo use the NetTcpBinding with Windows for transport security

  1. Ajouter un <netTcpBinding > à la section des liaisons,Add a <netTcpBinding> to the bindings section,

  2. Ajouter un <binding> et définissez la name attribut une valeur appropriée.Add a <binding> element and set the name attribute to an appropriate value.

  3. Ajouter un <security> et affectez le mode attribut TransportWithMessageCredential.Add a <security> element, and set the mode attribute to TransportWithMessageCredential.

  4. Ajouter un <transport> et définissez la clientCredentialType attribut Windows.Add a <transport> element and set the clientCredentialType attribute to Windows.

  5. Ajouter un <message> et définissez la clientCredentialType attribut une valeur appropriée.Add a <message> element and set the clientCredentialType attribute to an appropriate value. Dans l'exemple de code suivant, un certificat est affecté à la valeur.The following code sets the value to a certificate.

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

Voir aussiSee Also

Guide pratique pour définir le mode de sécuritéHow to: Set the Security Mode
Sécurisation de servicesSecuring Services
Sécurisation des services et des clientsSecuring Services and Clients