Condividi tramite


Informazioni sul livello di protezione

La ProtectionLevel proprietà è disponibile in molte classi diverse, ad esempio ServiceContractAttribute e le OperationContractAttribute classi . La proprietà controlla la modalità di protezione di una parte (o dell'intero) di un messaggio. Questo argomento illustra la funzionalità Windows Communication Foundation (WCF) e il relativo funzionamento.

Per istruzioni sull'impostazione del livello di protezione, vedere Procedura: Impostare la proprietà ProtectionLevel.

Annotazioni

I livelli di protezione possono essere impostati solo nel codice, non nella configurazione.

Nozioni di base

Per comprendere la funzionalità del livello di protezione, si applicano le istruzioni di base seguenti:

  • Esistono tre livelli di protezione di base per qualsiasi parte di un messaggio. La proprietà ,ovunque si verifichi, viene impostata su uno dei ProtectionLevel valori di enumerazione. In ordine crescente di protezione, includono:

    • None.

    • Sign. La parte protetta è firmata digitalmente. In questo modo si garantisce il rilevamento di eventuali manomissioni con la parte del messaggio protetto.

    • EncryptAndSign. La parte del messaggio viene crittografata per garantire la riservatezza prima della firma.

  • È possibile impostare i requisiti di protezione solo per i dati dell'applicazione con questa funzionalità. Ad esempio, le intestazioni WS-Addressing sono dati dell'infrastruttura e pertanto non sono influenzati da ProtectionLevel.

  • Quando la modalità di sicurezza è impostata su Transport, l'intero messaggio è protetto dal meccanismo di trasporto. Pertanto, l'impostazione di un livello di protezione separato per parti diverse di un messaggio non ha alcun effetto.

  • Il ProtectionLevel è un modo per permettere allo sviluppatore di impostare il livello minimo che un collegamento deve rispettare. Quando un servizio viene distribuito, l'associazione effettiva specificata nella configurazione può supportare o meno il livello minimo. Ad esempio, per impostazione predefinita, la BasicHttpBinding classe non fornisce sicurezza (anche se può essere abilitata). Pertanto, l'utilizzo con un contratto con qualsiasi impostazione diversa da None causerà il lancio di un'eccezione.

  • Se il servizio richiede che il minimo ProtectionLevel per tutti i messaggi sia Sign, un client (forse creato da una tecnologia non WCF) può crittografare e firmare tutti i messaggi (che è superiore al minimo richiesto). In questo caso, WCF non genererà un'eccezione perché il client ha eseguito più del minimo. Si noti, tuttavia, che le applicazioni WCF (servizi o client) non forniranno un'eccessiva sicurezza a una parte del messaggio quando possibile, ma saranno conformi al livello minimo di sicurezza. Si noti inoltre che quando si usa Transport come modalità di sicurezza, il trasporto può eccessivamente proteggere il flusso di messaggi perché intrinsecamente non è in grado di proteggere a un livello più granulare.

  • Se si imposta esplicitamente ProtectionLevel su Sign o EncryptAndSign, è necessario utilizzare un collegamento con sicurezza abilitata, altrimenti verrà generata un'eccezione.

  • Se si seleziona un'associazione che abilita la sicurezza e non si imposta la ProtectionLevel proprietà in un punto qualsiasi del contratto, tutti i dati dell'applicazione verranno crittografati e firmati.

  • Se si seleziona un binding che non ha la sicurezza abilitata (ad esempio, la classe BasicHttpBinding ha la sicurezza disabilitata per impostazione predefinita), e ProtectionLevel non è impostato esplicitamente, allora nessuno dei dati dell'applicazione sarà protetto.

  • Se si utilizza un'associazione che applica la sicurezza a livello di trasporto, tutti i dati dell'applicazione verranno protetti in base alle funzionalità del trasporto.

  • Se si usa un'associazione che applica la sicurezza a livello di messaggio, i dati dell'applicazione verranno protetti in base ai livelli di protezione impostati nel contratto. Se non si specifica un livello di protezione, tutti i dati dell'applicazione nei messaggi verranno crittografati e firmati.

  • L'oggetto ProtectionLevel può essere impostato a vari livelli di ambito. Esiste una gerarchia associata all'ambito, illustrata nella sezione successiva.

Definizione dell'ambito

Impostando l'API ProtectionLevel più in alto si imposta il livello per tutti i livelli al di sotto di essa. ProtectionLevel Se è impostato su un valore diverso a un livello inferiore, tutte le API al di sotto di tale livello nella gerarchia verranno ora reimpostate sul nuovo livello (le API sopra di essa, tuttavia, saranno comunque interessate dal livello più alto). La gerarchia è la seguente. Gli attributi allo stesso livello sono pari.

Livello di protezione della programmazione

Per programmare l'oggetto ProtectionLevel in qualsiasi punto della gerarchia, è sufficiente impostare la proprietà su un valore appropriato quando si applica l'attributo. Per esempi, vedere Procedura: Impostare la proprietà ProtectionLevel.

Annotazioni

L'impostazione della proprietà su errori e contratti di messaggio richiede la comprensione del funzionamento di tali funzionalità. Per altre informazioni, vedere Procedura: Impostare la proprietà ProtectionLevel e Utilizzo di contratti messaggio.

WS-Addressing dipendenza

Nella maggior parte dei casi, l'uso dello strumento utilità metadati ServiceModel (Svcutil.exe) per generare un client garantisce che i contratti client e di servizio siano identici. Tuttavia, contratti apparentemente identici possono indurre il cliente a generare un'eccezione. Ciò si verifica ogni volta che un vincolo non supporta la specifica WS-Addressing e vengono individuati più livelli di protezione nel contratto. Ad esempio, la BasicHttpBinding classe non supporta la specificazione. Oppure, se crei un'associazione personalizzata che non include il supporto per WS-Addressing. La ProtectionLevel funzionalità si basa sulla specifica WS-Addressing per abilitare livelli di protezione diversi su un singolo contratto. Se l'associazione non supporta la specifica WS-Addressing, tutti i livelli verranno impostati sullo stesso livello di protezione. Il livello di protezione effettivo per tutti gli ambiti del contratto verrà impostato sul livello di protezione più elevato utilizzato nel contratto.

Ciò può causare un problema difficile da identificare a prima vista. È possibile creare un contratto client (un'interfaccia) che include metodi per più di un servizio. Ovvero, la stessa interfaccia viene usata per creare un client che comunica con molti servizi e la singola interfaccia contiene metodi per tutti i servizi. Lo sviluppatore deve prestare attenzione in questo raro scenario a richiamare solo i metodi applicabili a ciascun servizio particolare. Se l'associazione è la BasicHttpBinding classe , non è possibile supportare più livelli di protezione. Tuttavia, un servizio che risponde al client potrebbe rispondere a un client con un livello di protezione inferiore a quello richiesto. In questo caso, il client genererà un'eccezione perché prevede un livello di protezione superiore.

Un esempio di codice illustra questo problema. L'esempio seguente illustra un servizio e un contratto client. Si supponga che l'associazione sia l'elemento <basicHttpBinding> . Pertanto, tutte le operazioni su un contratto hanno lo stesso livello di protezione. Questo livello di protezione uniforme viene determinato come livello di protezione massimo per tutte le operazioni.

Il contratto di servizio è:

[ServiceContract()]
public interface IPurchaseOrder
{
    [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
    int Price();
}
<ServiceContract()> _
Public Interface IPurchaseOrder
    <OperationContract(ProtectionLevel:=ProtectionLevel.Sign)> _
    Function Price() As Integer
End Interface

Il codice seguente illustra l'interfaccia del contratto client. Si noti che include un Tax metodo che deve essere usato con un servizio diverso:

[ServiceContract()]
public interface IPurchaseOrder
{
    [OperationContract()]
    int Tax();

    [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
    int Price();
}
<ServiceContract()> _
Public Interface IPurchaseOrder
    <OperationContract()> _
    Function Tax() As Integer

    <OperationContract(ProtectionLevel:=ProtectionLevel.Sign)> _
    Function Price() As Integer
End Interface

Quando il client chiama il Price metodo , genera un'eccezione quando riceve una risposta dal servizio. Ciò si verifica perché il client non specifica un ProtectionLevel nella ServiceContractAttribute, e di conseguenza utilizza il valore predefinito (EncryptAndSign) per tutti i metodi, incluso il metodo Price. Tuttavia, il servizio restituisce il valore usando il Sign livello perché il contratto di servizio definisce un singolo metodo con il relativo livello di protezione impostato su Sign. In questo caso, il client genererà un errore durante la convalida della risposta dal servizio.

Vedere anche