Identità del servizio e autenticazione
L' identità endpoint di un servizio è un valore generato dal linguaggio di descrizione dei servizi Web (WSDL, Web Services Description Language) del servizio. Questo valore, propagato a tutti i client, viene utilizzato per autenticare il servizio. Dopo che il client ha avviato una comunicazione con un endpoint e il servizio è stato autenticato nel client, quest'ultimo confronta il valore dell'identità endpoint con il valore effettivo restituito dal processo di autenticazione dell'endpoint. La corrispondenza di questi due valori costituisce garanzia per il client di aver contattato l'endpoint del servizio previsto. Questo meccanismo funziona come una protezione dal phishing, impedendo il reindirizzamento di un client a un endpoint ospitato da un servizio dannoso.
Per un'applicazione di esempio in cui viene illustrata l'impostazione dell'identità, vedere l'argomento Esempio identità del servizio. Per ulteriori informazioni su sugli endpoint e gli indirizzi degli endpoint, vedere Indirizzi endpoint.
Nota: |
---|
Quando si utilizza NTLM (NT LanMan) per l'autenticazione, l'identità del servizio non viene controllata, poiché, con NTLM, il client non è in grado di autenticare il server. L'autenticazione NTLM viene utilizzata quando i computer fanno parte di un gruppo di lavoro di Windows o quando eseguono una versione precedente di Windows che non supporta l'autenticazione Kerberos. |
Quando il client avvia un canale protetto per l'invio di un messaggio a un servizio, l'infrastruttura Windows Communication Foundation (WCF) autentica il servizio e invia il messaggio solo se l'identità del servizio corrisponde all'identità specificata nell'indirizzo dell'endpoint utilizzato dal client.
L'elaborazione dell'identità si articola nelle fasi seguenti:
In fase di progettazione, lo sviluppatore del client determina l'identità del servizio dai metadati dell'endpoint (esposti tramite WSDL).
In fase di esecuzione, l'applicazione client controlla le attestazioni delle credenziali di sicurezza del servizio, prima di inviare messaggi al servizio.
L'elaborazione dell'identità nel client è analoga all'autenticazione del client nel servizio. Un servizio protetto non esegue codice fino a quando non vengono autenticate le credenziali del client. Allo stesso modo, il client non invia messaggi al servizio fino a quando le credenziali del servizio non sono state autenticate in base a ciò che è noto in anticipo dai metadati del servizio.
La proprietà Identity della classe EndpointAddress rappresenta l'identità del servizio chiamato dal client. Il servizio pubblica Identity nei propri metadati. Quando lo sviluppatore del client esegue lo strumento Strumento ServiceModel Metadata Utility Tool (Svcutil.exe) sull'endpoint del servizio, la configurazione generata contiene il valore della proprietà Identity del servizio. L'infrastruttura WCF (se configurata con la protezione) verifica che il servizio abbia l'identità specificata.
Nota: |
---|
I metadati contengono l'identità prevista del servizio, pertanto è consigliabile esporre i metadati del servizio tramite mezzi di comunicazione protetti, ad esempio creando un endpoint HTTPS per il servizio. Per ulteriori informazioni, vedere How to: Secure Metadata Endpoints. |
Tipi di identità
Un servizio può fornire cinque tipi di identità. Ogni tipo di identità corrisponde a un elemento che può essere contenuto nell'elemento <identity> della configurazione. Il tipo utilizzato dipende dallo scenario e dai requisiti di sicurezza del servizio. Nella tabella seguente vengono descritti tutti i singoli tipi di identità.
Tipo di identità | Descrizione | Scenario tipico |
---|---|---|
DNS (Domain Name System) |
Utilizzare questo elemento con certificati X.509 o account di Windows. Confronta il nome DNS specificato nella credenziale con il valore specificato in questo elemento. |
Un controllo DNS consente di utilizzare certificati con nomi di soggetto o DNS. Se un certificato viene riemesso con lo stesso nome di soggetto o DNS, il controllo di identità resta valido. Quando un certificato viene riemesso, ottiene una nuova chiave RSA ma mantiene lo stesso nome di soggetto o DNS. Questo significa che i client non devono aggiornare le proprie informazioni di identità sul servizio. |
Certificato. Impostazione predefinita quando ClientCredentialType è impostato su Certificato. |
Questo elemento specifica un certificato X.509 con codifica Base64 da confrontare con il client. Utilizzare inoltre questo elemento quando si utilizza CardSpace come credenziale per autenticare il servizio. |
Questo elemento restringe l'autenticazione a un solo certificato in base al valore dell'identificazione personale. Ciò rende possibile un'autenticazione più restrittiva, poiché i valori dell'identificazione personale sono univoci. Occorre tuttavia notare che il certificato, se viene riemesso con lo stesso nome di soggetto, avrà anche una nuova identificazione personale. I client non saranno pertanto in grado di convalidare il servizio, a meno che non sia nota la nuova identificazione personale. Per ulteriori informazioni su sulla ricerca dell'identificazione personale di un certificato, vedere Procedura: recuperare l'identificazione personale di un certificato. |
Riferimento del certificato |
Identico all'opzione Certificato prima descritta. Tuttavia, questo elemento consente di specificare un nome di certificato e il percorso dell'archivio da cui recuperare il certificato. |
Uguale allo scenario Certificato prima descritto. Il vantaggio è che il percorso dell'archivio certificati può essere modificato. |
RSA |
Questo elemento specifica un valore della chiave RSA da confrontare con il client. È simile all'opzione certificato, ma invece dell'identificazione personale del certificato viene utilizzata la chiave RSA del certificato. |
Un controllo RSA consente di restringere specificamente l'autenticazione a un solo certificato in base alla relativa chiave RSA. Ciò rende possibile l'autenticazione più restrittiva di una chiave RSA specifica a spese del servizio, che non funziona più con i client esistenti, se il valore della chiave RSA viene modificato. |
Nome dell'entità utente (UPN). Impostazione predefinita quando ClientCredentialType è impostato su Windows e il processo del servizio non è in esecuzione con uno degli account di sistema. |
Questo elemento specifica l'UPN con cui è in esecuzione il servizio. Vedere la sezione sul protocollo Kerberos e l'identità di Override dell'identità di un servizio per l'autenticazione. |
Questo assicura che il servizio sia in esecuzione con un account utente di Windows specifico. L'account utente può essere l'utente attualmente connesso o il servizio in esecuzione con un particolare account utente. Questa impostazione sfrutta la protezione Kerberos di Windows, se il servizio è in esecuzione con un account di dominio all'interno di un ambiente Active Directory. |
Nome dell'entità servizio (SPN). Impostazione predefinita quando ClientCredentialType è impostato su Windows e il processo del servizio è in esecuzione con uno degli account di sistema: LocalService, LocalSystem o NetworkService. |
Questo elemento specifica il nome SPN associato all'account del servizio. Vedere la sezione sul protocollo Kerberos e l'identità di Override dell'identità di un servizio per l'autenticazione. |
Questo assicura che il nome SPN e l'account specifico di Windows a esso associato identifichino il servizio. È possibile utilizzare lo strumento Setspn.exe per associare un account computer per l'account utente del servizio. Questa impostazione sfrutta la protezione Kerberos di Windows, se il servizio è in esecuzione con uno degli account di sistema o con un account di dominio associato a un nome SPN e il computer è un membro di un dominio interno a un ambiente Active Directory. |
Impostazione dell'identità nel servizio
In genere, non è necessario impostare l'identità in un servizio, poiché la selezione di un tipo di credenziale client determina il tipo di identità esposto nei metadati del servizio. Per ulteriori informazioni su su come eseguire l'override o specificare l'identità del servizio, vedere Override dell'identità di un servizio per l'autenticazione.
Utilizzo 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.
<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;
Impostazione dell'identità nel client
In fase di progettazione, uno sviluppatore di client utilizza in genere lo strumento Strumento ServiceModel Metadata Utility Tool (Svcutil.exe) per generare la configurazione client. Il file di configurazione generato (destinato a essere utilizzato dal client) contiene l'identità del server. Ad esempio, il codice seguente viene generato da un servizio che specifica un'identità DNS, come illustrato nell'esempio precedente. Si noti che il valore dell'identità endpoint del client corrisponde a quello del servizio. In questo caso, quando il client riceve le credenziali Windows (Kerberos) per il servizio, si aspetta che il valore sia contoso.com
.
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_ICalculator_Windows">
<security>
<message clientCredentialType="Windows"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="https://localhost:8003/servicemodelsamples/service/dnsidentity"
binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_ICalculator_Windows"
contract="ICalculator"
name="WSHttpBinding_ICalculator">
<identity>
<dns value="contoso.com" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>
Se, invece di Windows, il servizio specifica un certificato come tipo di credenziale client, si prevede che la proprietà DNS del certificato corrisponda al valore contoso.com
(oppure, se la proprietà DNS è null, il nome di soggetto del certificato deve essere contoso.com
).
Utilizzo di un valore specifico per l'identità
Nel file di configurazione client seguente viene illustrato come si prevede che l'identità del servizio sia un valore specifico. Nell'esempio seguente, il client può comunicare con due endpoint. Il primo viene identificato con un'identificazione personale del certificato e il secondo con una chiave RSA del certificato, ovvero un certificato che contiene solo una coppia chiave pubblica/chiave privata ma non viene emesso da un'autorità attendibile.
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_ICalculator_Anonymous">
<security>
<message clientCredentialType="None" />
</security>
</binding >
</wsHttpBinding>
</bindings>
<client>
<endpoint
address="https://localhost:8003/servicemodelsamples/service/certificateidentity"
binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_ICalculator_Anonymous"
contract="ICalculator"
name="WSHttpBinding_ICalculator1">
<identity>
<certificate encodedValue="AwAAAAEAAAAUAAAARwEDOI5fk5i0+TbylJ9k8Kljle8gAAAAAQAAAMoBAAAwggHGMIIBdKADAgECAhCZcmDK722ujUz3waJ+O26gMAkGBSsOAwIdBQAwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3kwHhcNMDYwNTE3MjE0NDI1WhcNMzkxMjMxMjM1OTU5WjApMRAwDgYDVQQKEwdDb250b3NvMRUwEwYDVQQDEwxpZGVudGl0eS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMGaK9xvyFhuHXWGpWgO4HvOYnbLbfR/9vh77g/rJe0oq6FR1hwipzyYB+isgzhZYkRUZ4lWr2wUTCqsvlHKJ3yMxNHA8u8D/H/C+PWC0PUZYn5pSHamqJ6IYvsxZN6kcBAEiJtTGA6sA7PSP1eGDSIMVhJx1hSN6ojfJkgMLtZvAgMBAAGjSzBJMEcGA1UdAQRAMD6AEBLkCS0GHR1PAI1hIdwWZGOhGDAWMRQwEgYDVQQDEwtSb290IEFnZW5jeYIQBjdsAKoAZIoRz7jUqlw19DAJBgUrDgMCHQUAA0EAMH8nZCN1I8vwOiPekC94Jd3/l9jTd6j2RTKb9OZvi5t2qw5uuLSqdhH+fxbGxrXIngOSzpw0FM9LiXkHvNR42g==" />
</identity>
</endpoint>
<endpoint address="https://localhost:8003/servicemodelsamples/service/rsaidentity"
binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_ICalculator_Anonymous"
contract="ICalculator"
name="WSHttpBinding_ICalculator2">
<identity>
<rsa value="<RSAKeyValue><Modulus>wZor3G/IWG4ddYalaA7ge85idstt9H/2+HvuD+sl7SiroVHWHCKnPJgH6KyDOFliRFRniVavbBRMKqy+UconfIzE0cDy7wP8f8L49YLQ9RlifmlIdqaonohi+zFk3qRwEASIm1MYDqwDs9I/V4YNIgxWEnHWFI3qiN8mSAwu1m8=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>
Controllo dell'identità in fase di esecuzione
In fase di progettazione, un sviluppatore di client determina l'identità del server tramite i relativi metadati. In fase di esecuzione, il controllo dell'identità viene eseguito prima di chiamare qualsiasi endpoint nel servizio.
Il valore dell'identità è associato al tipo di autenticazione specificato dai metadati; in altre parole, al tipo di credenziali utilizzato per il servizio.
Se il canale è configurato per l'autenticazione tramite SSL (Secure Sockets Layer) a livello di messaggio o di trasporto con certificati X.509, sono validi i valori di identità seguenti:
DNS. WCF assicura che il certificato fornito durante l'handshake SSL contenga un attributo DNS o CommonName (CN) uguale al valore specificato nell'identità DNS sul client. Si noti che questi controlli vengono eseguiti in aggiunta alla determinazione della validità del certificato server. Per impostazione predefinita, WCF verifica che il certificato server sia stato emesso da un'autorità radice attendibile.
Certificato. Durante l'handshake SSL, WCF assicura che l'endpoint remoto fornisca il valore del certificato esatto specificato nell'identità.
Riferimento del certificato. Uguale a Certificato.
RSA. Durante l'handshake SSL, WCF assicura che l'endpoint remoto fornisca la chiave RSA esatta specificata nell'identità.
Se il servizio esegue l'autenticazione utilizzando SSL a livello di messaggio o di trasporto con una credenziale Windows e negozia la credenziale, sono validi i valori di identità seguenti:
DNS. La negoziazione passa il nome SPN del servizio, in modo che il nome DNS possa essere controllato. Il nome SPN presenta il formato
host/<dns name>
.SPN. Viene restituito un SPN del servizio esplicito, ad esempio,
host/myservice
.UPN. UPN dell'account di servizio. L'UPN è nel formato username@domain. Ad esempio, quando il servizio è in esecuzione con un account utente, l'UPN può essere
username@contoso.com
.
L'impostazione dell'identità a livello di programmazione (utilizzando la proprietà Identity) è facoltativa. Se non viene specificata alcuna identità, e il tipo di credenziale client è Windows, l'impostazione predefinita è SPN con il valore impostato sulla parte del nome host dell'indirizzo dell'endpoint del servizio preceduta dal valore letterale "host/". Se non viene specificata alcuna identità, e il tipo di credenziale client è un certificato, l'impostazione predefinita è Certificate. Questo vale per la protezione a livello di messaggio e di trasporto.
Identità e associazioni personalizzate
Poiché l'identità di un servizio dipende dal tipo di associazione utilizzato, assicurarsi che sia esposta un'identità appropriata quando si crea un'associazione personalizzata. Ad esempio, nell'esempio di codice seguente, l'identità esposta non è compatibile con il tipo di sicurezza, poiché l'identità per l'associazione bootstrap di conversazione protetta non corrisponde all'identità per l'associazione sull'endpoint. L'associazione di conversazione protetta imposta l'identità DNS, mentre WindowsStreamSecurityBindingElement imposta l'identità UPN o SPN.
Dim binding As New CustomBinding()
' The following binding exposes a DNS identity.
binding.Elements.Add(SecurityBindingElement.CreateSecureConversationBindingElement(SecurityBindingElement.CreateIssuedTokenForSslBindingElement(New IssuedSecurityTokenParameters())))
' The following element requires a UPN or SPN identity.
binding.Elements.Add(New WindowsStreamSecurityBindingElement())
binding.Elements.Add(New TcpTransportBindingElement())
CustomBinding binding = new CustomBinding();
// The following binding exposes a DNS identity.
binding.Elements.Add(SecurityBindingElement.
CreateSecureConversationBindingElement(
SecurityBindingElement.
CreateIssuedTokenForSslBindingElement(
new IssuedSecurityTokenParameters())));
// The following element requires a UPN or SPN identity.
binding.Elements.Add(new WindowsStreamSecurityBindingElement());
binding.Elements.Add(new TcpTransportBindingElement());
Per ulteriori informazioni su su come creare correttamente uno stack di elementi di associazione per un'associazione personalizzata, vedere Creazione di associazioni definite dall'utente. Per ulteriori informazioni su sulla creazione di un'associazione personalizzata con SecurityBindingElement, vedere Procedura: creare un elemento SecurityBindingElement per una modalità di autenticazione specificata.
Vedere anche
Attività
Procedura: creare un elemento SecurityBindingElement per una modalità di autenticazione specificata
Procedura: creare un verificatore di identità client personalizzato
Procedura: recuperare l'identificazione personale di un certificato
Concetti
Procedura: creare un'associazione personalizzata utilizzando SecurityBindingElement
Selezione di un tipo di credenziale
Utilizzo dei certificati
Strumento ServiceModel Metadata Utility Tool (Svcutil.exe)
Creazione di associazioni definite dall'utente