Panoramica sulla sicurezza del trasporto
I meccanismi di sicurezza del trasporto in Windows Communication Foundation (WCF) dipendono dal binding e dal trasporto in uso. Ad esempio, quando si utilizza la classe WSHttpBinding, il trasporto è HTTP e il meccanismo principale per la sicurezza del trasporto è SSL (Secure Sockets Layer) su HTTP, comunemente noto come HTTP. In questo argomento vengono illustrati i principali meccanismi di sicurezza del trasporto usati nei binding forniti dal sistema WCF.
Nota
Quando viene usata la sicurezza SSL con .NET Framework 3.5 e versioni successive, un client WCF usa sia i certificati intermedi nel proprio archivio certificati sia i certificati intermedi ricevuti durante la negoziazione SSL per eseguire la convalida della catena di certificati sul certificato del servizio. In .NET Framework 3.0 vengono usati solo i certificati intermedi installati nell'archivio certificati locale.
Avviso
Quando viene utilizzata la sicurezza del trasporto, è possibile che la proprietà Thread.CurrentPrincipal venga sovrascritta. Per evitare che ciò accada, impostare ServiceAuthorizationBehavior.PrincipalPermissionMode su PrincipalPermissionMode.None. ServiceAuthorizationBehavior è un comportamento del servizio che può essere impostato sulla descrizione del servizio.
BasicHttpBinding
Per impostazione predefinita, la classe BasicHttpBinding non fornisce sicurezza. Questa associazione è progettata per essere interoperabile con i provider di servizi Web che non implementano funzionalità di sicurezza. La sicurezza può essere tuttavia attivata impostando la proprietà Mode su qualsiasi valore diverso da None. Per abilitare la sicurezza del trasporto, impostare tale proprietà su Transport.
Interazione con IIS
La classe BasicHttpBinding viene utilizzata principalmente per interagire con i servizi Web esistenti, molti dei quali sono ospitati da Internet Information Services (IIS). Di conseguenza, la sicurezza del trasporto per questa associazione è progettata per interagire senza difficoltà con i siti IIS. Questo risultato si ottiene impostando la modalità di sicurezza su Transport e quindi specificando il tipo di credenziale client. I valori relativi al tipo di credenziale corrispondono ai meccanismi di sicurezza directory ISS. Nel codice seguente viene illustrata l'impostazione della modalità e del tipo di credenziale su Windows. È possibile utilizzare questa configurazione quando il client e il server si trovano nello stesso dominio Windows.
BasicHttpBinding b = new BasicHttpBinding();
b.Security.Mode = BasicHttpSecurityMode.Transport ;
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
Dim b As BasicHttpBinding = New BasicHttpBinding()
b.Security.Mode = BasicHttpSecurityMode.Transport
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows
oppure in configurazione:
<bindings>
<basicHttpBinding>
<binding name="SecurityByTransport">
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
</bindings>
Nelle sezioni seguenti vengono illustrati altri tipi di credenziali client.
Di base
Questo tipo corrisponde al metodo di autenticazione di base di IIS. Quando si utilizza questa modalità, il server IIS deve essere configurato con gli account utente di Windows e le autorizzazioni del file system NTFS appropriate. Per altre informazioni su IIS 6.0, vedere Abilitazione dell'autenticazione di base e configurazione del nome dell'area di autenticazione. Per altre informazioni su IIS 7.0, vedere Configurare l'autenticazione di base (IIS 7).
Certificate
In IIS è disponibile un'opzione affinché i client debbano eseguire l'accesso con un certificato. Questa funzionalità consente inoltre di eseguire il mapping di un certificato client a un account di Windows. Per altre informazioni su IIS 6.0, vedere Abilitazione dei certificati client in IIS 6.0. Per altre informazioni su IIS 7.0, vedere Configurazione dei certificati del server in IIS 7.
Digest
L'autenticazione digest è simile all'autenticazione di base, ma offre il vantaggio di inviare le credenziali come un hash, anziché in testo non crittografato. Per altre informazioni su IIS 6.0, vedere Autenticazione digest in IIS 6.0. Per altre informazioni su IIS 7.0, vedere Configurare l'autenticazione digest (IIS 7).
Finestre
Questo tipo corrisponde al metodo di autenticazione integrata di Windows di IIS. In caso di impostazione su questo valore, si prevede inoltre che il server sia in un dominio Windows che utilizza il protocollo Kerberos come controller di dominio. Se il server non è in un dominio con supporto Kerberos o se il sistema Kerberos ha esito negativo, è possibile utilizzare il valore NTLM (NT LAN Manager) descritto nella sezione successiva. Per altre informazioni su IIS 6.0, vedere Autenticazione integrata di Windows in IIS 6.0. Per altre informazioni su IIS 7.0, vedere Configurazione dei certificati del server in IIS 7.
NTLM
Consente al server di utilizzare NTLM per l'autenticazione se il protocollo Kerberos ha esito negativo. Per altre informazioni sulla configurazione di IIS in IIS 6.0, vedere Forzare l'autenticazione NTLM. Per IIS 7.0, l'autenticazione di Windows include l'autenticazione NTLM. Per altre informazioni, vedere Configuring Server Certificates in IIS 7(Configurazione dei certificati del server in IIS 7).
WsHttpBinding
La classe WSHttpBinding è progettata per essere interoperabile con i servizi che implementano le specifiche WS - *. La sicurezza basata sul trasporto di questa associazione è SSL (Secure Sockets Layer) su HTTP, ovvero HTTPS. Per creare un'applicazione WCF che usa SSL, usare IIS per ospitarla. In alternativa, se si sta creando un'applicazione indipendente, utilizzare lo strumento HttpCfg.exe per associare un certificato X.509 a una porta specifica in un computer. Il numero della porta viene specificato all'interno dell'applicazione WCF come indirizzo dell'endpoint. Quando si utilizza la modalità di trasporto, l'indirizzo dell'endpoint deve includere il protocollo HTTPS; in caso contrario verrà generata un'eccezione in fase di esecuzione. Per altre informazioni, vedere Sicurezza del trasporto HTTP.
L'autenticazione client, impostare la proprietà ClientCredentialType della classe HttpTransportSecurity su uno dei valori di enumerazione di HttpClientCredentialType. I valori di enumerazione corrispondono ai tipi di credenziali client per BasicHttpBinding e sono progettati per essere ospitati nei servizi IIS.
Nell'esempio seguente viene illustrata l'associazione utilizzata con un tipo di credenziale client di Windows.
// The code uses a shortcut to specify the security mode to Transport.
WSHttpBinding b = new WSHttpBinding(SecurityMode.Transport);
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
' The code uses a shortcut to specify the security mode to Transport.
Dim b As WSHttpBinding = New WSHttpBinding(SecurityMode.Transport)
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows
WSDualHttpBinding
Questa associazione fornisce sicurezza solo a livello di messaggio, non a livello di trasporto.
NetTcpBinding
La classe NetTcpBinding utilizza il protocollo TCP per il trasporto dei messaggi. La sicurezza per la modalità di trasporto viene fornita implementando il protocollo TLS (Transport Layer Security) su TCP. L'implementazione di TLS viene fornita dal sistema operativo.
È inoltre possibile specificare il tipo di credenziale del client impostando la proprietà ClientCredentialType della classe TcpTransportSecurity su uno dei valori di TcpClientCredentialType, come illustrato nel codice seguente.
NetTcpBinding b = new NetTcpBinding();
b.Security.Mode = SecurityMode.Transport;
b.Security.Transport.ClientCredentialType =
TcpClientCredentialType.Certificate;
Dim b As NetTcpBinding = New NetTcpBinding()
b.Security.Mode = SecurityMode.Transport
b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate
Client
Sul client è necessario specificare un certificato utilizzando il metodo SetCertificate della classe X509CertificateInitiatorClientCredential.
Nota
Se si utilizza la sicurezza di Windows, non è necessario un certificato.
Nel codice seguente viene utilizzata l'identificazione digitale del certificato, che lo identifica in modo univoco. Per altre informazioni sui certificati, vedere Utilizzo dei certificati.
NetTcpBinding b = new NetTcpBinding();
b.Security.Mode = SecurityMode.Transport;
b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
EndpointAddress a = new EndpointAddress("net.tcp://contoso.com/TcpAddress");
ChannelFactory<ICalculator> cf = new ChannelFactory<ICalculator>(b, a);
cf.Credentials.ClientCertificate.SetCertificate(
StoreLocation.LocalMachine,
StoreName.My,
X509FindType.FindByThumbprint,
"0000000000000000000000000000000000000000");
Dim b As NetTcpBinding = New NetTcpBinding()
b.Security.Mode = SecurityMode.Transport
b.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate
Dim a As New EndpointAddress("net.tcp://contoso.com/TcpAddress")
Dim cf As ChannelFactory(Of ICalculator) = New ChannelFactory(Of ICalculator)(b, a)
cf.Credentials.ClientCertificate.SetCertificate( _
StoreLocation.LocalMachine, _
StoreName.My, _
X509FindType.FindByThumbprint, _
"0000000000000000000000000000000000000000")
In alternativa, specificare il certificato nella configurazione del client usando un elemento <clientCredentials> nella sezione comportamenti.
<behaviors>
<behavior>
<clientCredentials>
<clientCertificate findValue= "101010101010101010101010101010000000000"
storeLocation="LocalMachine" storeName="My"
X509FindType="FindByThumbPrint">
</clientCertificate>
</clientCredentials>
</behavior>
</behaviors>
NetNamedPipeBinding
La classe NetNamedPipeBinding è progettata per consentire una comunicazione efficiente intra-computer, ovvero per i processi in esecuzione sullo stesso computer, sebbene sia possibile creare canali named pipe tra due computer sulla stessa rete. Questa associazione fornisce sicurezza solo a livello di trasporto. Quando si creano applicazioni utilizzando questa associazione, gli indirizzi di endpoint devono includere "net.pipe" come protocollo.
WSFederationHttpBinding
Quando si utilizza la sicurezza del trasporto, in questa associazione viene utilizzato SSL su HTTP, noto come HTTPS, con un token emesso (TransportWithMessageCredential). Per altre informazioni sulle applicazioni federate, vedere Federazione e Token rilasciati.
NetPeerTcpBinding
La classe NetPeerTcpBinding costituisce un trasporto protetto progettato per consentire una comunicazione efficiente utilizzando la funzionalità di rete peer-to-peer. Come indicato dal nome della classe e dell'associazione, il protocollo è TCP. Quando la modalità di sicurezza è impostata su Trasporto, l'associazione implementa TLS su TCP. Per altre informazioni sulla funzionalità peer-to-peer, vedere Rete peer-to-peer.
MsmqIntegrationBinding e NetMsmqBinding
Per informazioni dettagliate sulla sicurezza del trasporto con Accodamento messaggi (precedentemente chiamato MSMQ), vedere Protezione dei messaggi mediante protezione del trasporto.