WCF - Sicurezza

Un servizio WCF vanta un robusto sistema di sicurezza con due modalità o livelli di sicurezza in modo che solo un cliente previsto possa accedere ai servizi. Le minacce alla sicurezza che sono comuni in una transazione distribuita sono moderate in larga misura da WCF.

Principali funzioni di sicurezza

Il servizio WCF ha quattro funzionalità di sicurezza chiave, come illustrato nella figura seguente.

  • Authentication - In questo caso, l'autenticazione non si limita all'identificazione del mittente del messaggio, ma è reciproca, ovvero l'autenticazione del destinatario del messaggio è necessaria per escludere la possibilità di qualsiasi tipo di attacco da parte dell'intermediario.

  • Authorization- Questo è il passaggio successivo intrapreso da un servizio WCF per garantire la sicurezza ed è qui determinato se il servizio deve autorizzare il chiamante a procedere ulteriormente o meno. Sebbene l'autorizzazione non dipenda dall'autenticazione, normalmente segue l'autenticazione.

  • Confidentiality- Lo scambio di informazioni tra un chiamante e un servizio viene mantenuto riservato per limitare la sua interpretazione da parte di altri per i quali il messaggio non è destinato. Per rendere possibile ciò, viene utilizzata la crittografia insieme a un'ampia varietà di altri meccanismi.

  • Integrity - L'ultimo concetto chiave è mantenere l'integrità, ovvero offrire la garanzia che il messaggio non è stato manomesso da nessuno nel suo percorso dal mittente al destinatario.

Trasferimento in modalità di protezione

WCF offre le seguenti modalità di sicurezza del trasferimento per garantire una comunicazione protetta tra un client e un server. Le diverse modalità di sicurezza del trasferimento sono menzionate di seguito.

  • None- Questa modalità non garantisce alcun tipo di protezione dei messaggi e il servizio non ottiene alcuna credenziale sul client. Questa modalità è altamente rischiosa, in quanto potrebbe consentire la manomissione del messaggio e quindi non è consigliata.

<wsHttpBinding>
   <binding name = "WCFSecurityExample">
      <security mode = "None"/>
   </binding>
</wsHttpBinding>
  • Transport- Questa modalità è il modo più semplice per ottenere un trasferimento sicuro del messaggio tramite l'uso di protocolli di comunicazione come TCP, IPC, Https e MSMQ. Questa modalità è più efficace quando il trasferimento è point-to-point e viene utilizzata principalmente in un ambiente controllato, ad esempio applicazioni intranet.

<wsHttpBinding>
   <binding name = "WCFSecurityExample">
      <security mode = "Transport"/>
   </binding>
</wsHttpBinding>
  • Message- La modalità di sicurezza consente l'autenticazione reciproca e offre la privacy in larga misura poiché i messaggi sono crittografati e possono essere trasportati tramite http, che non è considerato un protocollo sicuro. Qui la sicurezza viene fornita end-to-end senza considerare quanti intermediari sono coinvolti in un trasferimento di messaggi e se esiste o meno un trasporto sicuro. La modalità viene utilizzata in genere dalle applicazioni Internet.

<wsHttpBinding>
   <binding name = "WCFSecurityExample">
      <security mode = "Message"/>
   </binding>
</wsHttpBinding>
  • Mixed - Questa modalità di protezione non viene utilizzata frequentemente e l'autenticazione client viene offerta solo a livello di client.

<wsHttpBinding>
   <binding name = "WCFSecurityExample">
      <security mode = "TransportWithMessageCredential"/>
   </binding>
</wsHttpBinding>
  • Both- Questa modalità di sicurezza comprende sia la sicurezza del trasporto che la sicurezza dei messaggi per offrire una solida copertura di sicurezza, ma spesso si traduce in un sovraccarico delle prestazioni complessive. Questo è supportato solo da MSMQ.

<netMsmqBinding>
   <binding name = "WCFSecurityExample">
      <security mode = "Both"/>
   </binding>
</netMsmqBinding>

Tutti i binding WCF tranne BasicHttpBinding hanno una certa sicurezza di trasferimento per impostazione predefinita.

Livello di protezione dei messaggi

La sicurezza a livello di messaggio non dipende dai protocolli WCF. Viene utilizzato con i dati dei messaggi stessi crittografando i dati utilizzando un algoritmo standard. Sono disponibili numerose credenziali client per diverse associazioni per il livello di sicurezza dei messaggi e vengono discusse di seguito.

Client credentials for message level security in WCF

None- Qui, la crittografia viene utilizzata per proteggere il messaggio, mentre non viene eseguita l'autenticazione del client, il che significa che il servizio è accessibile da un client anonimo. Ad eccezione di BasicHttpBinding, tutte le associazioni WCF supportano questa credenziale client. Tuttavia, va notato che per NetNamedPipeBinding, questa credenziale client non è affatto disponibile.

  • Windows- Qui, sia la crittografia dei messaggi che l'autenticazione del client avvengono per un utente connesso in tempo reale. Anche in questo caso, a differenza di tutti gli altri binding WCF, NetNamedPipeBinding non è disponibile e BasicHttpBinding non fornisce il suo supporto.

  • UserName- Qui, i messaggi sono crittografati e protetti offrendo un nome utente ei client vengono autenticati poiché devono offrire una password. BasicHttpBinding proprio come le due credenziali client precedenti, non supporta UserName e non è disponibile per NetNamedPipeBinding.

  • Certificate- Insieme alla crittografia dei messaggi, sia il client che il servizio ottengono un'autenticazione con certificato. Questa credenziale client è disponibile ed è supportata da tutte le associazioni WCF tranne NetNamedPipeBinding.

  • IssuedToken- I token emessi da un'autorità come Cardspace vengono utilizzati per autenticare i messaggi. Anche la crittografia dei messaggi viene eseguita qui.

Il codice seguente mostra come vengono configurate le credenziali del client nel livello / modalità di sicurezza dei messaggi WCF.

<netTcpBinding>
   <binding name = "WCFMessageSecurityExample">
      <security mode = "Message">
         <message clientCredentialType = "None"/>
      </security>   
   </binding>
</netTcpBinding>

<netMsmqBinding>...</netMsmqBinding>
</bindings>
<behaviors>...</behaviors>

In questo caso, è necessario notare che la modalità di sicurezza del trasporto ha un vantaggio rispetto al livello di sicurezza dei messaggi, poiché la prima è più veloce. Non richiede alcuna codifica aggiuntiva e offre supporto per l'interoperabilità e quindi non riduce le prestazioni complessive.

Tuttavia, dal punto di vista della sicurezza, la modalità di protezione dei messaggi è più robusta ed è indipendente dai protocolli e offre una protezione end-to-end.