Eseguire l'override dell'identità di un servizio per l'autenticazione
In genere non è necessario impostare l'identità in un servizio, perché la selezione del tipo di credenziale di un client impone il tipo di identità esposto nei metadati del servizio. Nel codice di configurazione seguente viene, ad esempio, usato l'elemento <wsHttpBinding> e impostato l'attributo clientCredentialType
su Windows.
Nel frammento WSDL (Web Services Description Language) viene mostrata l'identità dell'endpoint precedentemente definito. In questo esempio, il servizio è in esecuzione come servizio indipendente con un particolare account utente (username@contoso.com
) e pertanto l'identità UPN (User Principal Name) contiene il nome dell'account. L'UPN è anche noto anche come nome di accesso dell'utente in un dominio Windows.
Per un'applicazione di esempio in cui venga illustrata l'impostazione dell'identità, vedere Esempio di identità del servizio. Per maggiori informazioni sull'identità del servizio, vedere Identità del servizio e autenticazione.
Autenticazione Kerberos e identità
Per impostazione predefinita, quando un servizio è configurato per l'uso di credenziali di Windows, viene generato un elemento <Identity> che contiene un elemento <userPrincipalName> o <servicePrincipalName> nel linguaggio WSDL. Se il servizio è in esecuzione con l'account LocalSystem
, LocalService
o NetworkService
, per impostazione predefinita viene generato un nome dell'entità servizio (SPN) nel formato host/
<nomehost> perché questi account hanno accesso ai dati SPN del computer. Se il servizio è in esecuzione con un account diverso, Windows Communication Foundation (WCF) genera un UPN sotto forma di <nomeutente>@<domainName>
. Questo si verifica perché l'autenticazione Kerberos richiede che venga fornito un UPN o un SPN al client per l'autenticazione del servizio.
È inoltre possibile usare lo strumento Setspn per registrare un SPN aggiuntivo con l'account di un servizio in un dominio. È quindi possibile usare il nome SPN come identità del servizio. Per ulteriori informazioni sullo strumento, vedere Panoramica di Setspn.
Nota
Per usare il tipo di credenziale di Windows senza negoziazione, l'account utente del servizio deve avere accesso al nome SPN registrato con il dominio Active Directory. Puoi eseguire quanto sopra nei modi seguenti:
Usare l'account NetworkService o LocalSystem per eseguire il servizio. Poiché questi account hanno accesso al nome SPN del computer stabilito quando il computer viene associato al dominio Active Directory, WCF genera automaticamente l'elemento SPN corretto nell'endpoint del servizio nei metadati (WSDL) del servizio.
Usare un account di dominio Active Directory arbitrario per eseguire il servizio. In questo caso, stabilire un SPN per l'account di dominio, eventualmente usando l'utilità Setspn.exe. Dopo aver creato il nome SPN per l'account del servizio, configurare WCF per la pubblicazione del nome SPN in questione nei client del servizio tramite i relativi metadati (WSDL). Questa operazione viene eseguita impostando l'identità dell'endpoint esposto tramite un file di configurazione dell'applicazione o tramite codice.
Per ulteriori informazioni sugli SPN, sul protocollo Kerberos e su Active Directory, vedere la pagina relativa al Supplemento tecnico Kerberos per Windows.
SPN o UPN corrispondente a una stringa vuota
Se si imposta il nome SPN o UPN come stringa vuota si verificano diverse cose, a seconda del livello di sicurezza e della modalità di autenticazione usati:
Se si sta usando la protezione del trasporto, viene scelta l'autenticazione NT LanMan (NTLM).
Se si sta usando la protezione dei messaggi, l'autenticazione potrebbe non riuscire, a seconda della modalità scelta:
Se si sta usando la modalità
spnego
e l'attributoAllowNtlm
è impostato sufalse
, l'autenticazione avrà esito negativo.Se si sta usando la modalità
spnego
e l'attributoAllowNtlm
è impostato sutrue
, l'autenticazione avrà esito negativo se l'UPN è vuoto, ma avrà esito positivo se l'SPN è vuoto.Se si sta usando la modalità Kerberos diretta, nota anche come "monofase", l'autenticazione avrà esito negativo.
Uso dell'elemento <identity> nella configurazione
Se si imposta su Certificate
il tipo di credenziale client nell'associazione prima descritta, il codice WSDL generato conterrà un certificato X.509 con serializzazione Base64 per il valore dell'identità, come illustrato nel codice seguente. Si tratta dell'impostazione predefinita per tutti i tipi di credenziale client diversi da Windows.
È possibile modificare il valore dell'identità del servizio predefinita o il tipo dell'identità usando l'elemento <identity>
nella configurazione o impostando l'identità nel codice. Nel codice di configurazione seguente viene impostata un'identità DNS (Domain Name System) con il valore contoso.com
.
Impostare l'identità a livello di programmazione
Il servizio non deve necessariamente specificare in modo esplicito un'identità, poiché WCF la determina automaticamente. Tuttavia, WCF consente di specificare un'identità su un endpoint, se necessario. Nel codice seguente viene aggiunto un nuovo endpoint di servizio con un'identità DNS specifica.
ServiceEndpoint ep = myServiceHost.AddServiceEndpoint(
typeof(ICalculator),
new WSHttpBinding(),
String.Empty);
EndpointAddress myEndpointAdd = new EndpointAddress(new Uri("http://localhost:8088/calc"),
EndpointIdentity.CreateDnsIdentity("contoso.com"));
ep.Address = myEndpointAdd;
Dim ep As ServiceEndpoint = myServiceHost.AddServiceEndpoint(GetType(ICalculator), New WSHttpBinding(), String.Empty)
Dim myEndpointAdd As New EndpointAddress(New Uri("http://localhost:8088/calc"), EndpointIdentity.CreateDnsIdentity("contoso.com"))
ep.Address = myEndpointAdd