Selezione di un tipo di credenziale
Le credenziali sono i dati utilizzati da Windows Communication Foundation (WCF) per attestare un'identità o alcune funzionalità. Ad esempio, un passaporto è una credenziale rilasciata da un'autorità dello Stato per provare la cittadinanza in un paese o una regione. In WCF, le credenziali possono essere di vario tipo, ad esempio token del nome utente e certificati X.509. In questo argomento vengono esaminate le credenziali, come vengono utilizzate in WCF e come selezionare la credenziale appropriata per l'applicazione.
In molti paesi e regioni, la patente di guida costituisce un esempio di credenziale. Oltre a contenere dati che descrivono l'identità e le capacità di un individuo, una patente contiene una prova di possesso, ovvero la foto del titolare. La patente viene inoltre rilasciata da un'autorità attendibile, in genere un apposito ente governativo e, allo scopo di impedire manomissioni e falsificazioni, viene sigillata ed eventualmente corredata di ologramma.
Quando si presenta una credenziale occorre presentare sia i dati sia la prova di possesso dei dati. WCF supporta vari tipi di credenziale, basati su sistemi di sicurezza sia a livello di trasporto sia a livello di messaggio. Si considerino ad esempio due tipi di credenziali supportati in WCF: nome utente e certificati (X.509).
Nel primo tipo di credenziale, il nome utente rappresenta l'attestazione di identità e la password rappresenta la prova di possesso. In questo caso l'autorità attendibile è il sistema che convalida nome utente e password.
Se la credenziale è un certificato X.509, il nome del soggetto, il nome alternativo del soggetto o i campi specifici del certificato possono essere utilizzati come attestazioni di identità, mentre gli altri campi, ad esempio i campi Valid From e Valid To, specificano la validità del certificato.
Tipi di credenziali a livello di trasporto
Nella tabella seguente vengono illustrati i tipi di credenziali client che possono essere utilizzati da un'associazione nella modalità di sicurezza del trasporto. Quando si crea un servizio, impostare la proprietà ClientCredentialType su uno di questi valori per specificare il tipo di credenziale che il client deve fornire per comunicare con il servizio. È possibile impostare i tipi nel codice o nei file di configurazione.
Impostazione | Descrizione |
---|---|
None |
Specifica che il client non deve presentare alcuna credenziale. Il client viene pertanto autenticato come anonimo. |
Di base |
Specifica l'autenticazione di base per il client. Per ulteriori informazioni, vedere il documento RFC2617 HTTP Authentication: Basic and Digest Authentication (il contenuto potrebbe essere in inglese). |
Digest |
Specifica l'autenticazione digest per il client. Per ulteriori informazioni, vedere il documento RFC2617 HTTP Authentication: Basic and Digest Authentication (il contenuto potrebbe essere in inglese). |
Ntlm |
Specifica l'autenticazione NT LAN Manager (NTLM). Viene utilizzato quando non è possibile utilizzare l'autenticazione Kerberos per qualche motivo. È inoltre possibile disabilitarne l'utilizzo come fallback impostando la proprietà AllowNtlm su false, affinché WCF effettui tutti i tentativi possibili per generare un'eccezione se viene utilizzata l'autenticazione NTLM. Si noti che l'impostazione di questa proprietà su false potrebbe non impedire l'invio di credenziali NTLM nella rete. |
Windows |
Specifica l'autenticazione Windows. Per specificare solo il protocollo Kerberos in un dominio Windows, impostare la proprietà AllowNtlm su false (l'impostazione predefinita è true). |
Certificato |
Esegue l'autenticazione client mediante un certificato X.509. |
Password |
L'utente deve specificare un nome utente e una password. Convalidare la coppia di nome utente/password utilizzando l'autenticazione di Windows o un'altra soluzione personalizzata. |
Tipi di credenziale utilizzati nella sicurezza client a livello di messaggio
La tabella seguente mostra i tipi di credenziali utilizzabili quando si crea un'applicazione che utilizza la sicurezza a livello di messaggio. I valori riportati possono essere utilizzati nel codice o nei file di configurazione.
Impostazione | Descrizione |
---|---|
Nessuna |
Specifica che il client non deve presentare una credenziale. Il client viene pertanto autenticato come anonimo. |
Windows |
Consente lo scambio di messaggi SOAP all'interno di un contesto di sicurezza stabilito mediante una credenziale Windows. |
Nome utente |
Consente al servizio di richiedere che l'autenticazione del client si basi su una credenziale di tipo nome utente. Si noti che in WCF il nome utente non può essere utilizzato in nessuna operazione di crittografia, ad esempio la generazione di una firma o la crittografia di dati. Di conseguenza, quando si utilizzano credenziali di tipo nome utente, WCF verifica che il trasporto sia protetto. |
Certificato |
Consente al servizio di richiedere che il client venga autenticato tramite un certificato X.509. |
Token emesso |
Un tipo di token personalizzato, configurato in base a un criterio di sicurezza. Il tipo di token predefinito è Security Assertions Markup Language (SAML). Il token viene emesso da un servizio token di sicurezza. Per ulteriori informazioni, vedere Federazione e token emessi. |
Modello di negoziazione delle credenziali del servizio
La negoziazione è il processo in base al quale si stabilisce l'attendibilità tra un client e un servizio mediante lo scambio di credenziali. Il processo viene eseguito in maniera iterativa tra il client e il servizio in modo da divulgare solo le informazioni necessarie per il passaggio successivo nel processo di negoziazione. In pratica, il risultato finale è il recapito della credenziale di un servizio al client da utilizzare nelle operazioni successive.
Con una sola eccezione, le associazioni fornite dal sistema in WCF per impostazione predefinita negoziano automaticamente la credenziale del servizio quando si utilizza la sicurezza a livello di messaggio (l'eccezione è BasicHttpBinding, che non consente la sicurezza per impostazione predefinita). Per disabilitare questo comportamento, vedere le proprietà NegotiateServiceCredential e NegotiateServiceCredential.
Nota: |
---|
Quando viene utilizzata la sicurezza SSL con .NET Framework 3.5 e versioni successive, un client WCF utilizza 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. .NET Framework 3.0 utilizza solo i certificati intermedi installati nell'archivio certificati locale. |
Negoziazione fuori banda
Se la negoziazione automatica è disabilitata, la credenziale del servizio deve essere fornita al client prima di inviare qualsiasi messaggio al servizio. Questa operazione è anche nota come provisioning fuori banda. Ad esempio, se il tipo di credenziale specificato è un certificato e la negoziazione automatica è disabilitata, il client deve contattare il proprietario del servizio per ricevere e installare il certificato nel computer che esegue l'applicazione client. Questa operazione può essere eseguita, ad esempio, quando si desidera controllare accuratamente i client che possono accedere a un servizio in uno scenario business-to-business. La negoziazione fuori banda può essere eseguita tramite posta elettronica e il certificato X.509 può essere archiviato nell'archivio certificati di Windows, mediante uno strumento come lo snap-in Certificati di Microsoft Management Console (MMC).
Nota: |
---|
La proprietà ClientCredentials viene utilizzata per fornire al servizio un certificato ottenuto tramite la negoziazione fuori banda. Questa proprietà è necessaria quando si utilizza la classe BasicHttpBinding poiché l'associazione non consente la negoziazione automatica. La proprietà viene utilizzata anche in uno scenario duplex non correlato. Si tratta di un scenario in cui un server invia un messaggio al client senza richiedere prima al client l'invio di una richiesta al server. Poiché il server non riceve una richiesta dal client, deve utilizzare il certificato del client per crittografare il messaggio per il client. |
Impostazione dei valori di credenziale
Dopo aver selezionato una modalità di sicurezza, è necessario specificare le effettive credenziali. Ad esempio, se il tipo di credenziale è impostato su "certificato", è necessario associare una credenziale specifica (ad esempio un certificato X.509 specifico) al servizio o client.
Il metodo per l'impostazione del valore della credenziale differisce leggermente se si programma un servizio o un client.
Impostazione delle credenziali del servizio
Se si sta utilizzando la modalità di trasporto e si utilizza HTTP come trasporto, è necessario utilizzare Internet Information Services (IIS) o configurare la porta con un certificato. Per ulteriori informazioni, vedere Panoramica sulla sicurezza del trasporto e Protezione del trasporto HTTP.
Per fornire le credenziali a un servizio tramite il codice, creare un'istanza della classe ServiceHost e specificare la credenziale appropriata utilizzando la classe ServiceCredentials, a cui si accede tramite la proprietà Credentials.
Impostazione di un certificato
Per fornire a un servizio un certificato X.509 da utilizzare per autenticare il servizio nei client, utilizzare il metodo SetCertificate della classe X509CertificateRecipientServiceCredential.
Per fornire a un servizio un certificato client, utilizzare il metodo SetCertificate della classe X509CertificateInitiatorServiceCredential.
Impostazione delle credenziali di Windows
Se il client specifica un nome utente e una password validi, tali credenziali vengono utilizzate per autenticare client. In caso contrario, vengono utilizzate le credenziali dell'utente connesso.
Impostazione delle credenziali del client
In WCF, le applicazioni client utilizzano un client WCF per connettersi ai servizi. Ogni client deriva dalla classe ClientBase e la proprietà ClientCredentials sul client consente alla specifica di vari valori delle credenziali client.
Impostazione di un certificato
Per fornire a un servizio un certificato X.509 utilizzato per autenticare il client per un servizio, utilizzare il metodo SetCertificate della classe X509CertificateInitiatorClientCredential.
Come utilizzare le credenziali client per autenticare il client per il servizio
Le informazioni sulla credenziale client richieste per comunicare con un servizio vengono fornite mediante la proprietà ClientCredentials o la proprietà Credentials. Il canale di sicurezza utilizza queste informazioni per autenticare il client per il servizio. L'autenticazione viene eseguita tramite una delle due modalità seguenti:
Le credenziali client vengono utilizzate una volta prima che il primo messaggio venga inviato, utilizzando l'istanza client WCF per stabilire un contesto di sicurezza. Tutti i messaggi dell'applicazione vengono quindi protetti tramite il contesto di sicurezza.
Le credenziali client vengono utilizzate per autenticare ogni messaggio dell'applicazione inviato al servizio. In questo caso, nessun contesto viene stabilito tra il client e il servizio.
Non è possibile modificare le identità stabilite
Quando si utilizza il primo metodo, il contesto stabilito viene associato permanentemente all'identità del client. Pertanto, quando il contesto di sicurezza è stato stabilito, l'identità associata al client non può essere modificata.
Nota: |
---|
È necessario tenere presente un aspetto legato all'impossibilità di cambiare identità (quando viene stabilito il contesto di sicurezza, ovvero il comportamento predefinito). Se si crea un servizio che comunica con un secondo servizio, l'identità utilizzata per aprire il client WCF al secondo servizio non può essere modificata. Questo diventa un problema se più client possono utilizzare il primo servizio e il servizio rappresenta i client nell'accesso al secondo servizio. Se il servizio riutilizza lo stesso client per tutti i chiamanti, tutte le chiamate al secondo servizio vengono eseguite con l'identità del primo chiamante utilizzato per aprire il client al secondo servizio. In altre parole, il servizio utilizza l'identità del primo client per tutti i client che vogliono comunicare con il secondo servizio. Ciò può causare un'elevazione di privilegi. Se questo non è il comportamento desiderato del servizio, è necessario registrare ogni chiamante e creare un nuovo client per il secondo servizio per ogni singolo chiamante e verificare che il servizio utilizzi solo il client corretto per consentire ai diversi chiamanti la comunicazione con il secondo servizio. |
Per ulteriori informazioni su credenziali e le sessioni protette, vedere Considerazioni sulla protezione per le sessioni protette.
Vedere anche
Riferimento
System.ServiceModel.ClientBase
System.ServiceModel.ClientBase.ClientCredentials
System.ServiceModel.Description.ClientCredentials.ClientCertificate
System.ServiceModel.BasicHttpMessageSecurity.ClientCredentialType
System.ServiceModel.HttpTransportSecurity.ClientCredentialType
System.ServiceModel.MessageSecurityOverHttp.ClientCredentialType
System.ServiceModel.MessageSecurityOverMsmq.ClientCredentialType
System.ServiceModel.MessageSecurityOverTcp.ClientCredentialType
System.ServiceModel.TcpTransportSecurity.ClientCredentialType
System.ServiceModel.Security.X509CertificateInitiatorClientCredential.SetCertificate(System.Security.Cryptography.X509Certificates.StoreLocation,System.Security.Cryptography.X509Certificates.StoreName,System.Security.Cryptography.X509Certificates.X509FindType,System.Object)
System.ServiceModel.Security.X509CertificateInitiatorClientCredential.SetCertificate(System.String,System.Security.Cryptography.X509Certificates.StoreLocation,System.Security.Cryptography.X509Certificates.StoreName)
System.ServiceModel.Security.X509CertificateInitiatorServiceCredential.SetCertificate(System.String,System.Security.Cryptography.X509Certificates.StoreLocation,System.Security.Cryptography.X509Certificates.StoreName)
Concetti
Programmazione delle funzionalità di sicurezza di WCF
Protezione del trasporto HTTP