Procedura: creare un'associazione personalizzata usando SecurityBindingElement

In WCF (Windows Communication Foundation) sono incluse numerose associazioni fornite dal sistema che possono essere configurate, ma che non forniscono totale flessibilità durante la configurazione di tutte le opzioni di sicurezza supportate da WCF. In questo argomento viene illustrato come creare direttamente un'associazione personalizzata di singoli elementi di associazione e vengono evidenziate alcune impostazioni di sicurezza che è possibile specificare durante la creazione di tale associazione. Per altre informazioni sulla creazione di associazioni personalizzate, vedere Estensione dei binding.

Avviso

SecurityBindingElement non supporta la forma di IDuplexSessionChannel, vale a dire la forma di canale predefinita utilizzata dal trasporto TCP quando l'oggetto TransferMode è impostato su Buffered. È necessario impostare TransferMode su Streamed per utilizzare SecurityBindingElement in questo scenario.

Creazione di un'associazione personalizzata

In WCF tutte le associazioni sono costituite da elementi di binding. Ogni elemento di associazione deriva dalla classe BindingElement. Per le associazioni standard fornite dal sistema, vengono creati e configurati gli elementi di associazione, sebbene sia possibile personalizzare alcune delle impostazioni delle proprietà.

Al contrario, per creare un'associazione personalizzata, vengono creati e configurati gli elementi di associazione dai quali viene creato CustomBinding.

A tale scopo, vengono aggiunti singoli elementi di associazione a una raccolta rappresentata da un'istanza della classe BindingElementCollection, quindi la proprietà Elements di CustomBinding viene impostata allo stesso modo dell'oggetto. È necessario aggiungere gli elementi di associazione nell'ordine seguente: Transaction Flow, Reliable Session, Security, Composite Duplex, One-way, Stream Security, Message Encoding e Transport. Si noti che non tutti gli elementi di associazione elencati sono necessari in ogni associazione.

SecurityBindingElement

Tre elementi di associazione sono correlati alla protezione a livello di messaggio e sono tutti derivati dalla classe SecurityBindingElement. I tre elementi sono TransportSecurityBindingElement, SymmetricSecurityBindingElement e AsymmetricSecurityBindingElement. TransportSecurityBindingElement viene utilizzato per fornire una protezione in modalità mista. Gli altri due elementi sono utilizzati quando la protezione è fornita dal livello di messaggio.

Le classi aggiuntive vengono utilizzate quando viene fornita la protezione a livello di trasporto:

Elementi di associazione obbligatori

Esiste un ampio numero di possibili elementi di associazione che si possono combinare in un'associazione. Non tutte queste combinazioni sono valide. Contenuto della sezione vengono descritti gli elementi obbligatori che devono essere presenti in un'associazione di sicurezza.

Le associazioni di sicurezza valide dipendono da molti fattori, tra cui:

  • Modalità di sicurezza.

  • Protocollo di trasporto.

  • Modello di scambio dei messaggi (MEP, Message Exchange Pattern) specificato nel contratto.

Nella tabella seguente vengono illustrate le configurazioni dello stack dell'elemento di associazione valide per ogni combinazione dei fattori precedenti. Si noti che si tratta di requisiti minimi. È possibile aggiungere ulteriori elementi all'associazione, ad esempio elementi di associazione di codifica dei messaggi, di transazione e di altro tipo.

Modalità di sicurezza Trasporto Modello di scambio dei messaggi del contratto Modello di scambio dei messaggi del contratto Modello di scambio dei messaggi del contratto
Datagram Request Reply Duplex
Trasporto Https
OneWayBindingElement
HttpsTransportBindingElement HttpsTransportBindingElement
TCP
OneWayBindingElement
SSL o Windows StreamSecurityBindingElement SSL o Windows StreamSecurityBindingElement SSL o Windows StreamSecurityBindingElement
TcpTransportBindingElement TcpTransportBindingElement TcpTransportBindingElement
Message Http SymmetricSecurityBindingElement SymmetricSecurityBindingElement SymmetricSecurityBindingElement (modalità di autenticazione = SecureConversation)
CompositeDuplexBindingElement
OneWayBindingElement OneWayBindingElement
HttpTransportBindingElement HttpTransportBindingElement HttpTransportBindingElement
TCP SecurityBindingElement SecurityBindingElement SymmetricSecurityBindingElement (modalità di autenticazione = SecureConversation)
TcpTransportBindingElement TcpTransportBindingElement TcpTransportBindingElement
Misto (trasporto con credenziali messaggio) Https TransportSecurityBindingElement TransportSecurityBindingElement
OneWayBindingElement
HttpsTransportBindingElement HttpsTransportBindingElement
TCP TransportSecurityBindingElement SymmetricSecurityBindingElement (modalità di autenticazione = SecureConversation) SymmetricSecurityBindingElement (modalità di autenticazione = SecureConversation)
OneWayBindingElement
SSL o Windows StreamSecurityBindingElement SSL o Windows StreamSecurityBindingElement SSL o Windows StreamSecurityBindingElement
TcpTransportBindingElement TcpTransportBindingElement TcpTransportBindingElement

Si noti che esistono molte impostazioni configurabili in SecurityBindingElements. Per altre informazioni, vedere Modalità di autenticazione SecurityBindingElement.

Per altre informazioni, vedere Proteggere conversazioni e sessioni.

Procedure

Per creare un'associazione personalizzata che utilizza un SymmetricSecurityBindingElement

  1. Creare un'istanza della classe BindingElementCollection con il nome outputBec.

  2. Chiamare il metodo statico M:System.ServiceModel.Channels.SecurityBindingElement.CreateSspiNegotiationBindingElement(true) che restituisce un'istanza della classe SymmetricSecurityBindingElement.

  3. Aggiungere SymmetricSecurityBindingElement alla raccolta (outputBec) chiamando il metodo Add di Collection<T> della classe BindingElement.

  4. Creare un'istanza della classe TextMessageEncodingBindingElement e aggiungerla alla raccolta (outputBec). In tal modo viene specificata la codifica utilizzata dall'associazione.

  5. Creare un HttpTransportBindingElement e aggiungerlo alla raccolta (outputBec). In tal modo viene specificato che l'associazione utilizza il trasporto HTTP.

  6. Creare una nuova associazione personalizzata creando un'istanza della classe CustomBinding e passando la raccolta outputBec al costruttore.

  7. L'associazione personalizzata risultante condivide molte delle stesse caratteristiche di WSHttpBinding standard. Specifica la protezione a livello di messaggio e le credenziali di Windows, ma disattiva le sessioni protette. Richiede che la credenziale del servizio venga specificata fuori banda e non crittografa le firme. È possibile controllare l'ultima solo impostando la proprietà MessageProtectionOrder come indicato nel passaggio 4. Le altre possono essere controllate utilizzando le impostazioni nell'associazione standard.

Esempio

Descrizione

Nell'esempio seguente è riportata una funzione completa per creare un'associazione personalizzata che utilizza un SymmetricSecurityBindingElement.

Codice

// Create an empty CustomBinding to populate
CustomBinding binding = new CustomBinding();
// Create a SymmetricSecurityBindingElement.
SymmetricSecurityBindingElement ssbe =
    SecurityBindingElement.CreateSspiNegotiationBindingElement(true);
// Add the SymmetricSecurityBindingElement to the BindingElementCollection.
binding.Elements.Add(ssbe);
binding.Elements.Add(new TextMessageEncodingBindingElement());
binding.Elements.Add(new HttpTransportBindingElement());
return new CustomBinding(binding);
Public Shared Function CreateCustomBinding() As Binding
    ' Create an empty Custom Binding to populate, 
    Dim binding As New CustomBinding()
    ' Create a SymmetricSecurityBindingElement.
    Dim ssbe As SymmetricSecurityBindingElement
    ssbe = SecurityBindingElement.CreateSspiNegotiationBindingElement(True)
    ' Add the SymmetricSecurityBindingElement to the BindingElementCollection.
    binding.Elements.Add(ssbe)
    binding.Elements.Add(New TextMessageEncodingBindingElement())
    binding.Elements.Add(New HttpTransportBindingElement())
    Return New CustomBinding(binding)

End Function

Vedi anche