Programmazione delle funzionalità di protezione di WCF

Questo argomento descrive le attività di programmazione fondamentali utilizzate per creare un'applicazione Windows Communication Foundation (WCF) protetta. In particolare, questo argomento tratta le funzionalità di autenticazione, riservatezza e integrità, complessivamente note come protezione di trasferimento. Questo argomento non descrive l'autorizzazione (ovvero il controllo dell'accesso a risorse o servizi). Per ottenere informazioni in merito, vedere Autorizzazione.

Nota

Per un'introduzione ai concetti di protezione, in particolare quelli correlati a WCF, vedere l'insieme di modelli ed esercitazioni pratiche disponibili in MSDN nella pagina relativa a scenari, modelli e istruzioni di implementazione per Web Services Enhancements (WSE) 3.0 (il contenuto potrebbe essere in inglese).

La programmazione delle funzionalità di protezione di WCF si basa su tre passaggi: impostazione della modalità di protezione, impostazione di un tipo di credenziale client e impostazione dei valori di credenziale. Questi passaggi possono essere eseguiti in codice o in configurazione.

Impostazione della modalità di protezione

Di seguito vengono descritti i passaggi generali per programmare la modalità di protezione in WCF:

  1. Scegliere fra le associazioni predefinite un'associazione appropriata ai requisiti dell'applicazione. Per un elenco delle associazioni disponibili, vedere Associazioni fornite dal sistema. Per impostazione predefinita, quasi tutte le associazioni presentano un meccanismo di protezione attivo. L'unica eccezione è la classe BasicHttpBinding, che in configurazione è rappresentata dall'basicHttpBinding Element.
    L'associazione scelta determina il trasporto. Ad esempio, l'associazione WSHttpBinding utilizza il protocollo HTTP come trasporto, mentre l'associazione NetTcpBinding utilizza il trasporto TCP.
  2. Selezionare per l'associazione una delle modalità di protezione. Si noti che l'insieme delle modalità fra cui è possibile scegliere dipende dall'associazione scelta. Ad esempio, l'associazione WSDualHttpBinding non consente di scegliere la protezione a livello di trasporto. Analogamente, né l'associazione MsmqIntegrationBinding né l'associazione NetNamedPipeBinding consentono di scegliere la protezione a livello di messaggio.
    Sono disponibili tre opzioni:
    1. Transport
      La protezione a livello di trasporto dipende dal meccanismo utilizzato dall'associazione scelta. Ad esempio, se si utilizza l'associazione WSHttpBinding, il meccanismo di protezione è Secure Sockets Layer (SSL), che peraltro è anche il meccanismo del protocollo HTTPS. In generale, il vantaggio principale della protezione a livello di trasporto è che offre una buona velocità effettiva indipendentemente dal trasporto utilizzato. Tuttavia, tale tipo di protezione presenta due limiti. Anzitutto, il meccanismo di trasporto impone il tipo di credenziale utilizzato per autenticare un utente. Di fatto ciò rappresenta uno svantaggio solo se un servizio deve garantire l'interoperabilità con altri servizi che richiedono vari tipi di credenziali. Inoltre, poiché la protezione non viene applicata a livello di messaggio, la protezione viene implementata in modo hop-by-hop anziché end-to-end. Questo secondo limite rappresenta un problema solo se il percorso dei messaggi fra client e servizio prevede intermediari. Per ulteriori informazioni su quale trasporto utilizzare, vedere Scelta di un trasporto. Per ulteriori informazioni sull'utilizzo della protezione a livello di trasporto, vedere Panoramica sulla protezione del trasporto.
    2. Message
      Nella protezione a livello di messaggio, ogni messaggio contiene le intestazioni e i dati necessari a garantire la protezione del messaggio. Poiché la composizione delle intestazioni è variabile, è possibile includere qualsiasi numero di credenziali. Ciò risulta essere un fattore rilevante se occorre interoperare con altri servizi che richiedono un tipo di credenziale specifico che un meccanismo di trasporto non è in grado di fornire, oppure se il messaggio deve essere utilizzato in più servizi, ognuno avente un requisito specifico di tipo di credenziale.
      Per ulteriori informazioni, vedere Protezione dei messaggi in WCF.
    3. TransportWithMessageCredential
      Questa scelta utilizza il livello di trasporto per proteggere il trasferimento dei messaggi, ognuno dei quali contiene le credenziali dettagliate richieste dagli altri servizi. Ciò combina il vantaggio in termini di prestazioni della protezione a livello di trasporto con il vantaggio delle credenziali dettagliate della protezione a livello di messaggio. Questa opzione è disponibile per le associazioni seguenti: BasicHttpBinding, WSFederationHttpBinding, NetPeerTcpBinding e WSHttpBinding.
  3. Se si decide di utilizzare la protezione a livello di trasporto per il protocollo HTTP (ovvero il protocollo HTTPS), è inoltre necessario configurare l'host con un certificato SSL e quindi attivare il protocollo SSL su una porta. Per ulteriori informazioni, vedere Protezione del trasporto HTTP.
  4. Se si utilizza l'associazione WSHttpBinding e non occorre stabilire una sessione protetta, impostare la proprietà EstablishSecurityContext su false.
    Una sessione protetta si verifica quando un client e un servizio creano un canale utilizzando una chiave simmetrica, ovvero quando sia il client sia il server utilizzano la stessa chiave per la durata della conversazione e fino alla chiusura del dialogo.

Impostazione del tipo di credenziale client

Selezionare un tipo di credenziale client in base alle proprie esigenze. Per ulteriori informazioni, vedere Selezione di un tipo di credenziale. Sono disponibili i tipi di credenziale client seguenti:

  • Windows
  • Certificate
  • Digest
  • Basic
  • UserName
  • NTLM
  • IssuedToken

L'impostazione del tipo di credenziale dipende dalla modalità impostata. Se ad esempio è stata selezionata l'associazione wsHttpBinding e la modalità è stata impostata sulla protezione a livello di messaggio, l'attributo clientCredentialType dell'elemento Message può essere impostato su uno dei valori seguenti: None, Windows, UserName, Certificate e IssuedToken, come mostrato nell'esempio di configurazione seguente.

<system.serviceModel>
<bindings>
  <wsHttpBinding>
    <binding name="myBinding">
      <security mode="Message"/>
      <message clientCredentialType="Windows"/>
    </binding>
</bindings>
</system.serviceModel>

Oppure nel codice:

Impostazione dei valori di credenziale del servizio

Dopo aver selezionato un tipo di credenziale client è necessario impostare le credenziali effettivamente utilizzate dal servizio e dal client. Nel servizio, le credenziali vengono impostate utilizzando la classe ServiceCredentials e restituite tramite la proprietà Credentials della classe ServiceHostBase. L'associazione utilizzata determina il tipo di credenziale del servizio, la scelta della modalità di protezione e il tipo di credenziale client. Nel codice seguente un certificato viene impostato come credenziale di servizio.

Impostazione dei valori di credenziale del client

Nel client, i valori di credenziale vengono impostati utilizzando la classe ClientCredentials e restituiti tramite la proprietà ClientCredentials della classe ClientBase. Nel codice seguente un certificato viene impostato come credenziale in un client che utilizza il protocollo TCP.

Vedere anche

Altre risorse

Programmazione WCF di base
Scenari di protezione comuni