Selezione di un tipo di credenziale

Le credenziali sono i dati usati da Windows Communication Foundation (WCF) per stabilire un'identità o funzionalità richieste. 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 usate 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, è necessario presentare sia i dati sia la prova di possesso dei dati. WCF supporta vari tipi di credenziali, basati su sistemi di sicurezza sia a livello di trasporto sia a livello di messaggio. Si considerino ad esempio due tipi di credenziale 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 usati 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 usati 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
Nessuna 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 altre informazioni, vedere RFC2617, Autenticazione HTTP: autenticazione di base e del digest.
Digest Specifica l'autenticazione digest per il client. Per altre informazioni, vedere RFC2617, Autenticazione HTTP: autenticazione di base e del digest.
NTLM Specifica l'autenticazione NT LAN Manager (NTLM). Viene usato quando non è possibile usare l'autenticazione Kerberos per qualche motivo. È inoltre possibile disabilitarne l'uso come fallback impostando la proprietà AllowNtlm su false, affinché WCF effettui tutti i tentativi possibili per generare un'eccezione se viene usata l'autenticazione NTLM. Si noti che l'impostazione di questa proprietà su false potrebbe non impedire l'invio di credenziali NTLM nella rete.
Finestre Specifica l'autenticazione Windows. Per specificare solo il protocollo Kerberos in un dominio Windows, impostare la proprietà AllowNtlm su false (l'impostazione predefinita è true).
Certificate 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 usando l'autenticazione di Windows o un'altra soluzione personalizzata.

Tipi di credenziale usati nella sicurezza client a livello di messaggio

La tabella seguente mostra i tipi di credenziali usabili quando si crea un'applicazione che usa la sicurezza a livello di messaggio. I valori riportati possono essere usati 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.
Finestre Consente lo scambio di messaggi SOAP all'interno di un contesto di sicurezza stabilito mediante una credenziale Windows.
Username Consente al servizio di richiedere che l'autenticazione del client si basi su una credenziale di tipo nome utente. Si noti che in WCF i nomi utente non possono essere usati in nessuna operazione di crittografia, come la generazione di una firma o la crittografia di dati. Quando si usano credenziali di tipo nome utente, WCF assicura che il trasporto sia protetto.
Certificate 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 altre 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 usare 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 usa 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 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.

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 usata per fornire al servizio un certificato ottenuto tramite la negoziazione fuori banda. Questa proprietà è necessaria quando si usa la classe BasicHttpBinding poiché l'associazione non consente la negoziazione automatica. La proprietà viene usata 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 usare 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 usando la modalità di trasporto e si usa HTTP come trasporto, è necessario usare Internet Information Services (IIS) o configurare la porta con un certificato. Per altre informazioni, vedere Panoramica della sicurezza del trasporto e Sicurezza del trasporto HTTP.

Per fornire le credenziali a un servizio tramite il codice, creare un'istanza della classe ServiceHost e specificare la credenziale appropriata usando 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 usare per autenticare il servizio nei client, usare il metodo SetCertificate della classe X509CertificateRecipientServiceCredential.

Per fornire a un servizio un certificato client, usare 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 usate per autenticare client. In caso contrario, vengono usate le credenziali dell'utente connesso.

Impostazione delle credenziali del client

In WCF, le applicazioni client usano un client WCF per connettersi ai servizi. Ogni client deriva dalla classe ClientBase<TChannel> 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 usato per autenticare il client per un servizio, usare il metodo SetCertificate della classe X509CertificateInitiatorClientCredential.

Come usare 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 usa queste informazioni per autenticare il client per il servizio. L'autenticazione viene eseguita tramite una delle due modalità seguenti:

  • Le credenziali client vengono usate una volta prima che il primo messaggio venga inviato, usando 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 usate 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 usa 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.

Importante

È 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à usata per aprire il client WCF al secondo servizio non può essere modificata. Questo diventa un problema se più client possono usare il primo servizio e il servizio rappresenta i client nell'accesso al secondo servizio. Se il servizio riusa lo stesso client per tutti i chiamanti, tutte le chiamate al secondo servizio vengono eseguite con l'identità del primo chiamante usato per aprire il client al secondo servizio. In altre parole, il servizio usa 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 usi solo il client corretto per consentire ai diversi chiamanti la comunicazione con il secondo servizio.

Per altre informazioni sulle credenziali e sulle sessioni sicure, vedere Considerazioni sulla sicurezza per le sessioni sicure.

Vedi anche