Integrità dei dati via HTTP con Windows Communication Foundation

di Stefano Mostarda, in Windows Communication Foundation,

Nel precedente articolo è stata affrontata la tematica della sicurezza in Windows Communication Foundation (WCF) da un punto di vista generale, analizzando come questa potente infrastruttura permetta in breve tempo di inserire all'interno di un'applicazione le feature cardine di questo argomento: l'autenticazione, l'autorizzazione, la confidenzialità, l'integrità e l'auditing. In questo secondo articolo dedicato alla sicurezza, viene mostrato come si possono proteggere i dati utilizzando HTTP come protocollo di trasmissione ed i binding predefiniti che sono compresi nel motore di WCF.

Binding HTTP Predefiniti

Quando si parla di binding predefiniti per il trasporto dei messaggi via HTTP, si parla soprattutto del BasicHttpBinding, del WsHttpBinding e, in maniera minore, del WSDualHttpBinding. Queste tre configurazioni hanno differenze sostanziali per quanto riguarda le modalità di sicurezza in quanto utilizzano di base dei criteri diversi tra loro.

Come visto nell'articolo indicato sopra, esistono cinque criteri di protezione:

  • A livello di trasporto: i dati vengono resi sicuri sfruttando il protocollo di trasmissione com per esempio HTTPS (Transport Security);
  • A livello di messaggio: la sicurezza viene garantita dalla crittografia dei dati all'interno del messaggio (Message Security);
  • Credenziali spedite a livello di trasporta: la sicurezza viene gestita inviando le credenziali direttamente tramite il protocollo di comunicazione che garantisce anche integrità e confidenzialità (Transport with Message Credential);
  • Credenziali esclusivamente a livello di trasporto: le credenziali possono essere spedite solo a livello di protocollo che però non garantisce integrità e confidenzialità; di conseguenza viene utilizzata esclusivamente per autenticare il client. Questa modalità viene usata solo dal BasicHttpBinding (Transport Credential Only);
  • Entrambi: le credenziali sono spedite sia a livello di messaggio che di protocollo. Questa modalità viene utilizzata solo dal NetMsmqBinding (Both).

Nel corso dell'articolo sia la terminologia inglese che quella italiana verranno utilizzate in maniera intercambiabile.

BasicHttpBinding

Il BasicHttpBinding è pensato per la massima interoperabilità soprattutto con i WebService già esistenti basati su asmx e quelli che comunque rispettano le specifiche WS-I (che sono appunto quelle per l'interoperabilità tra servizi). Da questo, ne consegue che il BasicHttpBinding usa xml come encoding per il formato di trasmissione ed HTTP come protocollo. Nonostante uno dei motti di WCF sia "Secure By Default" (Sicuro per default) questo binding rappresenta la classica eccezione che conferma la regola, poiché, non vi è nessun meccanismo automatico di protezione associato. Anche se a prima vista questa può sembrare una grave limitazione per l'utilizzo in ambienti di produzione, in realtà non lo è. Ampliando il discorso, il web, per sua definizione, non è un ambiente sicuro a meno che non si ricorra ad un sistema che garantisca l'integrità non a livello di dati, ma di trasporto (Transport Security). In questo caso la soluzione principe è il ricorso all'utilizzo di SSL (Secure Socket Layer) su HTTP (noto come HTTPS). Grazie alla natura modulare e configurabile di Windows Communication Foundation è possibile intervenire sul BasicHttpBinding modificandone alcune caratteristiche ed intervenendo quindi sul tipo di trasporto che si deve utilizzare sia tramite web.config che tramite codice.

<basicHttpBinding>
    <binding name="TransportSecurity">
        <security mode="Transport">
            <transport clientCredentialType="None">
        </security>
    </binding>
</basicHttpBinding>

In questo snippet del web.config, è stato creato un binding di tipo BasicHttpBinding, in cui è stato specificato che viene utilizzato il trasporto come meccanismo di sicurezza e che non ci sono credenziali di accesso al servizio.
Se si volesse generare lo stesso binding tramite codice, allora si dovrebbe ricorrere al seguente snippet:

BasicHttpBinding b = new BasicHttpBinding(SecurityMode.Transport);
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.None
5 pagine in totale: 1 2 3 4 5
Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti