Procedura: utilizzare le funzionalità di sicurezza a livello di trasporto e le credenziali a livello di messaggio
L'utilizzo integrato delle funzionalità di sicurezza a livello di trasporto e delle credenziali a livello di messaggio consente di sfruttare le migliori funzionalità delle modalità di sicurezza a livello di trasporto e di messaggio di 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 utilizzare le associazioni WSHttpBinding e NetTcpBinding allo scopo di implementare un meccanismo di sicurezza basato sull'integrazione fra le funzionalità di sicurezza a livello di trasporto e le credenziali a livello di messaggio. Per ulteriori informazioni su 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)
Utilizzare lo strumento HttpCfg.exe per associare un certificato SSL a una porta del computer. Per ulteriori informazioni, vedere Procedura: configurare una porta con un certificato SSL.
Creare un'istanza della classe WSHttpBinding e impostare la proprietà Mode su TransportWithMessageCredential.
Impostare la proprietà ClientCredentialType su un valore appropriato. (Per ulteriori informazioni, vedere Selezione di un tipo di credenziale.) Nel codice seguente viene utilizzato il valore Certificate.
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.
Aggiungere un endpoint di servizio tramite il metodo AddServiceEndpoint.
Creare l'istanza della classe ServiceHost e chiamare il metodo Open, come mostrato nel codice seguente.
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()
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();
Per utilizzare l'associazione NetTcpBinding con un certificato allo scopo di fornire la protezione a livello di trasporto (in codice)
Creare un'istanza della classe NetTcpBinding e impostare la proprietà Mode su TransportWithMessageCredential.
Impostare la proprietà ClientCredentialType su un valore appropriato. Nel codice seguente viene utilizzato il valore Certificate.
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.
Creare l'istanza della classe ServiceHost.
Utilizzare il metodo SetCertificate della classe X509CertificateRecipientServiceCredential per impostare in modo esplicito il certificato X.509 del servizio.
Aggiungere un endpoint di servizio tramite il metodo AddServiceEndpoint.
Chiamare il metodo Open, come mostrato nel codice seguente.
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()
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();
Per utilizzare l'associazione NetTcpBinding con Windows allo scopo di fornire la protezione a livello di trasporto (in codice)
Creare un'istanza della classe NetTcpBinding e impostare la proprietà Mode su TransportWithMessageCredential.
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.
Impostare la proprietà ClientCredentialType su un valore appropriato. Nel codice seguente viene utilizzato il valore Certificate.
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.
Creare l'istanza della classe ServiceHost.
Utilizzare il metodo SetCertificate della classe X509CertificateRecipientServiceCredential per impostare in modo esplicito il certificato X.509 del servizio.
Aggiungere un endpoint di servizio tramite il metodo AddServiceEndpoint.
Chiamare il metodo Open, come mostrato nel codice seguente.
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()
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();
Utilizzo della configurazione
Per utilizzare l'associazione WSHttpBinding
Configurare il computer con un certificato SSL associato a una porta. (Per ulteriori informazioni, vedere Procedura: configurare una porta con un certificato SSL). In questa operazione di configurazione non è necessario impostare l'elemento <transport>.
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
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>
Aggiungere un netTcpBinding Element alla sezione delle associazioni.
Aggiungere un elemento di associazione e quindi impostare l'attributo name su un valore appropriato.
Aggiungere un elemento <security> e quindi impostare l'attributo mode su TransportWithMessageCredential.
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
Aggiungere un netTcpBinding Element alla sezione delle associazioni.
Aggiungere un elemento <binding> e impostare l'attributo name su un valore appropriato.
Aggiungere un elemento <security> e quindi impostare l'attributo mode su TransportWithMessageCredential.
Aggiungere un elemento <transport> e quindi impostare l'attributo clientCredentialType su Windows.
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>
Vedere anche
Attività
Procedura: impostare la modalità di sicurezza