Procedura: usare le funzionalità di sicurezza a livello di trasporto e le credenziali a livello di messaggio

La protezione di un servizio con credenziali di trasporto e messaggio usa le migliori modalità di sicurezza trasporto e messaggio in Windows Communication Foundation (WCF). Complessivamente, le funzionalità di sicurezza a livello di trasporto garantiscono integrità e riservatezza, mentre le funzionalità di sicurezza a livello di messaggio offrono vari tipi di credenziali non disponibili quando si utilizzano meccanismi di sicurezza basati esclusivamente sul livello di trasporto. In questo argomento vengono illustrati i passaggi di base per implementare il trasporto con credenziali messaggio utilizzando le associazioni WSHttpBinding e NetTcpBinding. Per altre informazioni sull'impostazione della modalità di sicurezza, vedere Procedura: Impostare la modalità di sicurezza.

Quando si imposta la modalità di sicurezza su TransportWithMessageCredential, il trasporto determina il meccanismo di sicurezza a livello di trasporto effettivamente utilizzato. Nel caso del protocollo HTTP, il meccanismo è Secure Sockets Layer (SSL) su HTTP (HTTPS). Nel caso del protocollo TCP, invece, il meccanismo è SSL su TCP oppure Windows.

Se il trasporto è HTTP (tramite l'associazione WSHttpBinding), il protocollo HTTPS fornisce la protezione a livello di trasporto. In tal caso è necessario configurare il computer che ospita il servizio con un certificato SSL associato a una porta, come mostrato in seguito in questo argomento.

Se il trasporto è TCP (tramite l'associazione NetTcpBinding), per impostazione predefinita la protezione a livello di trasporto fornita è la protezione di Windows oppure SSL su TCP. Quando si utilizza SSL su TCP è necessario utilizzare il metodo SetCertificate per specificare il certificato, come mostrato in seguito in questo argomento.

Per utilizzare l'associazione WSHttpBinding con un certificato allo scopo di fornire la protezione a livello di trasporto (in codice)

  1. Usare lo strumento HttpCfg.exe per associare un certificato SSL a una porta del computer. Per altre informazioni, vedere Procedura: configurare una porta con un certificato SSL.

  2. Creare un'istanza della classe WSHttpBinding e impostare la proprietà Mode su TransportWithMessageCredential.

  3. Impostare la proprietà ClientCredentialType su un valore appropriato. Per altre informazioni, vedere Selezione di un tipo di credenziale. Nel codice seguente viene utilizzato il valore Certificate.

  4. Creare un'istanza della classe Uri con un indirizzo di base appropriato. Si noti che l'indirizzo deve utilizzare lo schema "HTTPS" e deve contenere il nome effettivo del computer e il numero della porta a cui il certificato SSL è associato. In alternativa è possibile impostare l'indirizzo di base in configurazione.

  5. Aggiungere un endpoint di servizio tramite il metodo AddServiceEndpoint.

  6. Creare l'istanza della classe ServiceHost e chiamare il metodo Open, come mostrato nel codice seguente.

    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()
    

Per utilizzare l'associazione NetTcpBinding con un certificato allo scopo di fornire la protezione a livello di trasporto (in codice)

  1. Creare un'istanza della classe NetTcpBinding e impostare la proprietà Mode su TransportWithMessageCredential.

  2. Impostare la proprietà ClientCredentialType su un valore appropriato. Nel codice seguente viene utilizzato il valore Certificate.

  3. Creare un'istanza della classe Uri con un indirizzo di base appropriato. Si noti che l'indirizzo deve utilizzare lo schema "net.tcp". In alternativa è possibile impostare l'indirizzo di base in configurazione.

  4. Creare l'istanza della classe ServiceHost.

  5. Utilizzare il metodo SetCertificate della classe X509CertificateRecipientServiceCredential per impostare in modo esplicito il certificato X.509 del servizio.

  6. Aggiungere un endpoint di servizio tramite il metodo AddServiceEndpoint.

  7. Chiamare il metodo Open, come mostrato nel codice seguente.

    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()
    

Per utilizzare l'associazione NetTcpBinding con Windows allo scopo di fornire la protezione a livello di trasporto (in codice)

  1. Creare un'istanza della classe NetTcpBinding e impostare la proprietà Mode su TransportWithMessageCredential.

  2. Impostare la protezione a livello di trasporto in modo che utilizzi Windows. A tale scopo, impostare la proprietà ClientCredentialType su Windows. Si noti che questo valore è l'impostazione predefinita.

  3. Impostare la proprietà ClientCredentialType su un valore appropriato. Nel codice seguente viene utilizzato il valore Certificate.

  4. Creare un'istanza della classe Uri con un indirizzo di base appropriato. Si noti che l'indirizzo deve utilizzare lo schema "net.tcp". In alternativa è possibile impostare l'indirizzo di base in configurazione.

  5. Creare l'istanza della classe ServiceHost.

  6. Utilizzare il metodo SetCertificate della classe X509CertificateRecipientServiceCredential per impostare in modo esplicito il certificato X.509 del servizio.

  7. Aggiungere un endpoint di servizio tramite il metodo AddServiceEndpoint.

  8. Chiamare il metodo Open, come mostrato nel codice seguente.

    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()
    

Utilizzo della configurazione

Per utilizzare l'associazione WSHttpBinding

  1. Configurare il computer con un certificato SSL associato a una porta. Per altre informazioni, vedere Procedura: Configurare una porta con un certificato SSL. Non è necessario impostare un valore di elemento <transport> con questa configurazione.

  2. Specificare il tipo di credenziale client della protezione a livello di messaggio. Nell'esempio seguente l'attributo clientCredentialType dell'elemento <message> viene impostato su UserName.

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

Per utilizzare l'associazione NetTcpBinding con un certificato allo scopo di fornire la protezione a livello di trasporto

  1. Nel caso di SSL su TCP occorre specificare in modo esplicito il certificato nell'elemento <behaviors>. Nell'esempio seguente viene individuato un certificato in base alla relativa autorità emittente nel percorso di archivio predefinito (archivio locale del computer e archivio personale).

    <behaviors>
     <serviceBehaviors>
       <behavior name="mySvcBehavior">
           <serviceCredentials>
             <serviceCertificate findValue="contoso.com"
                                 x509FindType="FindByIssuerName" />
           </serviceCredentials>
       </behavior>
     </serviceBehaviors>
    </behaviors>
    
  2. Aggiungere un elemento <netTcpBinding> alla sezione binding

  3. Aggiungere un elemento di associazione e quindi impostare l'attributo name su un valore appropriato.

  4. Aggiungere un elemento <security> e impostare l'attributo mode su TransportWithMessageCredential.

  5. Aggiungere un elemento <message> e impostare l'attributo clientCredentialType su un valore appropriato.

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

Per utilizzare l'associazione NetTcpBinding con Windows allo scopo di fornire la protezione a livello di trasporto

  1. Aggiungere un elemento <netTcpBinding> alla sezione binding,

  2. Aggiungere un elemento <binding> e impostare l'attributo name su un valore appropriato.

  3. Aggiungere un elemento <security> e impostare l'attributo mode su TransportWithMessageCredential.

  4. Aggiungere un elemento <transport> e impostare l'attributo clientCredentialType su Windows.

  5. Aggiungere un elemento <message> e impostare l'attributo clientCredentialType su un valore appropriato. Nel codice seguente il valore viene impostato su un certificato.

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

Vedi anche