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, utilizzato l'elemento <wsHttpBinding>clientCredentialType e impostato l'attributo su Windows.
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_Windows">
<security mode="Message">
<message clientCredentialType="Windows"
establishSecurityContext="false"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<!-- other configuration code not shown -->
</system.serviceModel>
</configuration>
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.
<wsdl:service name="CalculatorService">
<wsdl:port name="WSHttpBinding_ICalculator_Windows"
binding="tns:WSHttpBinding_ICalculator_Windows">
<soap12:address
location=
"https://localhost:8003/servicemodelsamples/service/upnidentity" />
<wsa10:EndpointReference>
<wsa10:Address>
https://localhost:8003/servicemodelsamples/service/upnidentity
</wsa10:Address>
<Identity
xmlns="https://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
<Upn>username@contoso.com</Upn>
</Identity>
</wsa10:EndpointReference>
</wsdl:port>
</wsdl:service>
Per un'applicazione di esempio in cui venga illustrata l'impostazione dell'identità, vedere Esempio identità del servizio. Per ulteriori informazioni su sull'identità del servizio, vedere Identità del servizio e autenticazione.
Autenticazione Kerberos e identità
Per impostazione predefinita, quando un servizio viene configurato per utilizzare una credenziale di Windows, viene generato un elemento <identity><userPrincipalName> che contiene un elemento<servicePrincipalName> o in WSDL. Se il servizio è in esecuzione con l'account LocalSystem, LocalService o NetworkService, per impostazione predefinita viene generato un nome dell'entità servizio (SPN), sotto forma di host/<nomehost>, poiché questi account hanno accesso ai dati SPN del computer. Se il servizio è in esecuzione con un altro account, in Windows Communication Foundation (WCF) viene generato un UPN sotto forma di <nomeutente>@<nomedominio>. 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 utilizzare lo strumento Setspn.exe per registrare un SPN aggiuntivo con l'account di un servizio in un dominio. È quindi possibile utilizzare il nome SPN come identità del servizio. Per scaricare lo strumento, vedere Windows 2000 Resource Kit Tool: Setspn.exe. Per ulteriori informazioni su sullo strumento, vedere Panoramica di Setspn (il contenuto potrebbero essere in inglese).
Nota: |
---|
Per utilizzare 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. Questo risultato è ottenibile nei modi seguenti: |
Utilizzare 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.
Utilizzare un account di dominio Active Directory arbitrario per eseguire il servizio. In questo caso, stabilire un SPN per l'account di dominio, eventualmente utilizzando 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 su sugli SPN, sul protocollo Kerberos e su Active Directory, vedere il Supplemento tecnico Kerberos per Windows (il contenuto potrebbe essere in inglese).
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 utilizzati:
Se si sta utilizzando la protezione del trasporto, viene scelta l'autenticazione NT LanMan (NTLM).
Se si sta utilizzando la protezione dei messaggi, l'autenticazione potrebbe non riuscire, a seconda della modalità scelta:
Se si sta utilizzando la modalità spnego e l'attributo AllowNtlm è impostato su false, l'autenticazione avrà esito negativo.
Se si sta utilizzando la modalità spnego e l'attributo AllowNtlm è impostato su true, l'autenticazione avrà esito negativo se l'UPN è vuoto, ma avrà esito positivo se l'SPN è vuoto.
Se si sta utilizzando la modalità Kerberos diretta, nota anche come "monofase", l'autenticazione avrà esito negativo.
Utilizzo dell'elemento <identity> nella configurazione
Se si imposta su Certificate il tipo di credenziale client nell'associazione descritta in precedenza**,** 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.
<Identity xmlns="https://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<X509Data>
<X509Certificate>MIIBxjCCAXSgAwIBAgIQmXJgyu9tro1M98GifjtuoDAJBgUrDgMCHQUAMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5MB4XDTA2MDUxNzIxNDQyNVoXDTM5MTIzMTIzNTk1OVowKTEQMA4GA1UEChMHQ29udG9zbzEVMBMGA1UEAxMMaWRlbnRpdHkuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBmivcb8hYbh11hqVoDuB7zmJ2y230f/b4e+4P6yXtKKuhUdYcIqc8mAforIM4WWJEVGeJVq9sFEwqrL5Ryid8jMTRwPLvA/x/wvj1gtD1GWJ+aUh2pqieiGL7MWTepHAQBIibUxgOrAOz0j9Xhg0iDFYScdYUjeqI3yZIDC7WbwIDAQABo0swSTBHBgNVHQEEQDA+gBAS5AktBh0dTwCNYSHcFmRjoRgwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3mCEAY3bACqAGSKEc+41KpcNfQwCQYFKw4DAh0FAANBADB/J2QjdSPL8Doj3pAveCXd/5fY03eo9kUym/Tmb4ubdqsObri0qnYR/n8Wxsa1yJ4Dks6cNBTPS4l5B7zUeNo=</X509Certificate>
</X509Data>
</KeyInfo>
</Identity>
È possibile modificare il valore dell'identità del servizio predefinita o il tipo dell'identità utilizzando 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
.
Impostazione dell'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.
Dim ep As ServiceEndpoint = myServiceHost.AddServiceEndpoint(GetType(ICalculator), New WSHttpBinding(), String.Empty)
Dim myEndpointAdd As New EndpointAddress(New Uri("https://localhost:8088/calc"), EndpointIdentity.CreateDnsIdentity("contoso.com"))
ep.Address = myEndpointAdd
ServiceEndpoint ep = myServiceHost.AddServiceEndpoint(
typeof(ICalculator),
new WSHttpBinding(),
String.Empty);
EndpointAddress myEndpointAdd = new EndpointAddress(new Uri("https://localhost:8088/calc"),
EndpointIdentity.CreateDnsIdentity("contoso.com"));
ep.Address = myEndpointAdd;
Vedere anche
Attività
Procedura: creare un verificatore di identità client personalizzato