Condividi tramite


Protezione di client

In Windows Communication Foundation (WCF), il servizio determina i requisiti di sicurezza per i client. Ovvero specifica quale modalità di sicurezza utilizzare e se il client deve fornire o meno una credenziale. Il processo di protezione di un client, pertanto, è semplice: utilizzare i metadati ottenuti dal servizio (se è pubblicato) e generare un client. I metadati specificano come configurare il client. Se il servizio richiede al client di fornire una credenziale, è necessario ottenerne una che corrisponda al requisito. In questo argomento viene descritto il processo in modo dettagliato. Per altre informazioni sulla creazione di un servizio sicuro, vedere Protezione dei servizi.

Il servizio specifica la protezione

Le associazioni WCF hanno le funzionalità di sicurezza attive per impostazione predefinita. L'eccezione è BasicHttpBinding. Se il servizio, pertanto, è stato creato utilizzando WCF, è probabile che implementerà la protezione per assicurare autenticazione, riservatezza e integrità. In tal caso, i metadati forniti dal servizio indicheranno cosa è necessario per stabilire un canale di comunicazione protetto. Se i metadati del servizio non includono requisiti di sicurezza, non esiste alcuna possibilità di imporre uno schema di sicurezza, ad esempio Secure Sockets Layer (SSL) su HTTP, in un servizio. Se, tuttavia, il servizio richiede al client di fornire una credenziale, lo sviluppatore, il distributore o l'amministratore client deve fornire la credenziale effettiva che verrà utilizzata dal client per l'autenticazione al servizio.

Recupero di metadati

Quando si crea un client, eseguire innanzitutto il recupero di metadati per il servizio con il quale il client comunicherà. Questa operazione può essere eseguita in due modi. In primo luogo, se il servizio pubblica un endpoint di scambio di metadati (MEX) o rende disponibili i metadati su HTTP o HTTPS, è possibile scaricare i metadati utilizzando lo strumento ServiceModel Metadata Utility Tool (Svcutil.exe) e generare così sia file di codice per un client, sia un file di configurazione. Per altre informazioni sull'uso dello strumento, vedere Accesso ai servizi tramite un client WCF. Se il servizio non pubblica un endpoint MEX e non rende disponibili i metadati su HTTP o HTTPS, è necessario contattare il creatore del servizio per ottenere la documentazione che descrive i requisiti di sicurezza e i metadati.

Importante

È preferibile che i metadati provengano da un'origine attendibile e che non siano stati alterati. I metadati recuperati utilizzando il protocollo HTTP vengono inviati come testo non crittografato e possono essere alterati. Se il servizio utilizza le proprietà HttpsGetEnabled e HttpsGetUrl, utilizzare l'URL fornito dal creatore del servizio per scaricare i dati tramite il protocollo HTTPS.

Convalida della protezione

Le origini di metadati possono essere suddivise in due ampie categorie: origini attendibili e non attendibili. Se l'origine è attendibile e se vengono scaricati il codice client e altri metadati dall'endpoint MEX protetto di quell'origine, è possibile generare il client, fornire le credenziali corrette ed eseguirlo senza altri dubbi.

Se, tuttavia, si sceglie di scaricare un client e i metadati da un'origine sconosciuta, assicurarsi di convalidare le misure di sicurezza utilizzate dal codice. Non è sufficiente, ad esempio, creare semplicemente un client che invii le informazioni personali o finanziarie a un servizio a meno che quest'ultimo non richieda, come minimo, riservatezza e integrità. È necessario che il proprietario del servizio sia attendibile per l'ambito desiderato di diffusione delle informazioni, dato che queste saranno visibili al proprietario stesso.

Di norma, pertanto, quando si utilizzano codice e metadati provenienti da un'origine non attendibile, controllare il codice e i metadati per verificare che soddisfino il livello di sicurezza richiesto.

Impostazione di una credenziale client

L'impostazione di una credenziale client in un client è costituita da due passaggi:

  1. Determinare il tipo di credenziale client richiesto dal servizio. Questa operazione viene eseguita tramite uno dei due metodi seguenti. In primo luogo, se si dispone della documentazione proveniente dal creatore del servizio, è necessario specificare il tipo di credenziale client (se presente) richiesto dal servizio. Quindi, se si dispone solo di un file di configurazione generato dallo strumento Svcutil.exe, è possibile esaminare le singole associazioni per determinare il tipo di credenziale richiesto.

  2. Specificare una credenziale client effettiva. La credenziale client effettiva viene chiamata valore della credenziale client per distinguerla dal tipo. Se, ad esempio, il tipo di credenziale client specifica un certificato, è necessario fornire un certificato X.509 emesso da un'autorità di certificazione che il servizio considera attendibile.

Determinazione del tipo di credenziale client

Se si dispone del file di configurazione generato dallo strumento Svcutil.exe, esaminare la sezione <bindings> per determinare il tipo di credenziale client richiesto. All'interno della sezione esistono elementi di associazione che specificano i requisiti di sicurezza. Esaminare, in particolare, l'elemento <security> di ogni binding. L'elemento include l'attributo mode che è possibile impostare su uno dei tre valori seguenti, Message, Transport o TransportWithMessageCredential. Il valore dell'attributo determina la modalità che a sua volta determina quale degli elementi figlio è significativo.

L'elemento <security> è in grado di contenere un elemento <transport> o <message> o entrambi. L'elemento significativo è quello che corrisponde alla modalità di sicurezza. Nel codice seguente, ad esempio, viene specificato che la modalità di sicurezza è "Message" e il tipo di credenziale client per l'elemento <message> è "Certificate". In questo caso, l'elemento <transport> può essere ignorato. L'elemento <message>, tuttavia, specifica che è necessario che venga fornito un certificato X.509.

<wsHttpBinding>  
    <binding name="WSHttpBinding_ICalculator">  
       <security mode="Message">  
           <transport clientCredentialType="Windows"
                      realm="" />  
           <message clientCredentialType="Certificate"
                    negotiateServiceCredential="true"  
                    algorithmSuite="Default"
                    establishSecurityContext="true" />  
       </security>  
    </binding>  
</wsHttpBinding>  

Si noti che se l'attributo clientCredentialType è impostato su "Windows", come illustrato nell'esempio seguente, non è necessario fornire un valore della credenziale effettivo. Questo avviene perché la protezione integrata di Windows fornisce la credenziale effettiva (un token Kerberos) della persona che sta eseguendo il client.

<security mode="Message">  
    <transport clientCredentialType="Windows "
        realm="" />  
</security>  

Impostazione del valore della credenziale client

Se è stato stabilito che il client debba fornire una credenziale, utilizzare il metodo appropriato per configurare il client. Per impostare un certificato client, ad esempio, utilizzare il metodo SetCertificate.

Un tipo comune di credenziale è il certificato X.509. È possibile fornire la credenziale in due modi:

  • Tramite la programmazione della credenziale nel codice client (utilizzando il metodo SetCertificate).

Tramite l'aggiunta della sezione <comportamenti> del file di configurazione per il client e l'utilizzo dell'elemento clientCredentials come descritto di seguito.

Impostazione del valore <clientCredentials> nel codice

Per impostare un valore <clientCredentials> nel codice, è necessario accedere alla proprietà ClientCredentials della classe ClientBase<TChannel>. La proprietà restituisce un oggetto ClientCredentials che consente l'accesso a vari tipi di credenziali, come illustrato nella tabella seguente.

Proprietà ClientCredential Descrizione Note
ClientCertificate Restituisce X509CertificateInitiatorClientCredential. Rappresenta un certificato X.509 fornito dal client per l'autenticazione al servizio.
HttpDigest Restituisce HttpDigestClientCredential. Rappresenta una credenziale digest HTTP. La credenziale è un hash del nome utente e della password.
IssuedToken Restituisce IssuedTokenClientCredential. Rappresenta un token di sicurezza personalizzato emesso da un servizio token di sicurezza, utilizzato generalmente negli scenari di federazioni.
Peer Restituisce PeerCredential. Rappresenta una credenziale peer per la partecipazione in una rete di peer in un dominio Windows.
ServiceCertificate Restituisce X509CertificateRecipientClientCredential. Rappresenta un certificato X.509 fornito dal servizio in una negoziazione fuori banda.
UserName Restituisce UserNamePasswordClientCredential. Rappresenta una coppia nome utente e password.
Windows Restituisce WindowsClientCredential. Rappresenta una credenziale client di Windows (credenziale Kerberos). Le proprietà della classe sono in sola lettura.

Impostazione del valore <clientCredentials> nella configurazione

I valori della credenziale vengono specificati tramite un comportamento dell'endpoint come elementi figlio dell'elemento <clientCredentials>. L'elemento utilizzato dipende dal tipo di credenziale client. Nell'esempio seguente viene illustrata la configurazione utilizzata per impostare un certificato X.509 tramite <<clientCertificate>.

<configuration>  
  <system.serviceModel>  
    <behaviors>  
      <endpointBehaviors>
        <behavior name="myEndpointBehavior">  
          <clientCredentials>  
            <clientCertificate findvalue="myMachineName"
            storeLocation="Current" X509FindType="FindBySubjectName" />  
          </clientCredentials>  
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>  
</configuration>  

Per impostare la credenziale client nella configurazione, aggiungere l'elemento <endpointBehaviors> al file di configurazione. L'elemento di comportamento aggiunto deve inoltre essere collegato all'endpoint del servizio utilizzando l'attributo behaviorConfiguration dell'elemento <endpoint> di <client> come illustrato nell'esempio seguente. Il valore dell'attributo behaviorConfiguration deve corrispondere al valore dell'attributo name del comportamento.

<configuration>
  <system.serviceModel>
    <client>
      <endpoint address="http://localhost/servicemodelsamples/service.svc"
                binding="wsHttpBinding"
                bindingConfiguration="Binding1"
                behaviorConfiguration="myEndpointBehavior"
                contract="Microsoft.ServiceModel.Samples.ICalculator" />
    </client>
  </system.serviceModel>
</configuration>

Nota

È impossibile impostare alcuni dei valori della credenziale client utilizzando i file di configurazione dell'applicazione, ad esempio nome utente e password o i valori utente e password di Windows. È possibile specificare tali valori della credenziale solo nel codice.

Per altre informazioni sull'impostazione delle credenziali client, vedere Procedura: Specificare i valori delle credenziali client.

Nota

ClientCredentialType viene ignorato quando SecurityMode è impostato su "TransportWithMessageCredential", come illustrato nella configurazione di esempio seguente.

<wsHttpBinding>  
    <binding name="PingBinding">  
        <security mode="TransportWithMessageCredential"  >  
           <message  clientCredentialType="UserName"
               establishSecurityContext="false"
               negotiateServiceCredential="false" />  
           <transport clientCredentialType="Certificate"  />  
         </security>  
    </binding>  
</wsHttpBinding>  

Vedi anche