Como: Criar uma associação personalizada usando o SecurityBindingElement
O Windows Communication Foundation (WCF) inclui várias associações fornecidas pelo sistema que podem ser configuradas, mas não fornecem flexibilidade total ao configurar todas as opções de segurança suportadas pelo WCF. Este tópico demonstra como criar uma associação personalizada diretamente a partir de elementos de vinculação individuais e destaca algumas das configurações de segurança que podem ser especificadas ao criar essa associação. Para obter mais informações sobre como criar ligações personalizadas, consulte Estendendo ligações.
Aviso
SecurityBindingElement não suporta a forma de IDuplexSessionChannel canal, que é a forma de canal padrão usada pelo transporte TCP quando TransferMode está definida como Buffered. Você deve definir TransferMode como Streamed para usar SecurityBindingElement neste cenário.
Criando uma vinculação personalizada
No WCF, todas as ligações são compostas por elementos de ligação. Cada elemento de ligação deriva da BindingElement classe. Para as associações padrão fornecidas pelo sistema, os elementos de ligação são criados e configurados para você, embora você possa personalizar algumas das configurações de propriedade.
Por outro lado, para criar uma associação personalizada, os elementos de ligação são criados e configurados e um CustomBinding é criado a partir dos elementos de ligação.
Para fazer isso, adicione os elementos de vinculação individuais a uma coleção representada por uma instância da BindingElementCollection classe e, em seguida, defina a Elements
propriedade do CustomBinding
igual para esse objeto. Você deve adicionar os elementos de ligação na seguinte ordem: Fluxo de Transações, Sessão Confiável, Segurança, Duplex Composto, One-way, Segurança de Fluxo, Codificação de Mensagens e Transporte. Observe que nem todos os elementos de vinculação listados são necessários em todas as associações.
SecurityBindingElement
Três elementos de ligação estão relacionados à segurança no nível da mensagem, todos derivados da SecurityBindingElement classe. Os três são TransportSecurityBindingElement, SymmetricSecurityBindingElemente AsymmetricSecurityBindingElement. O TransportSecurityBindingElement é usado para fornecer segurança de modo misto. Os outros dois elementos são usados quando a camada de mensagem fornece segurança.
Classes adicionais são usadas quando a segurança de nível de transporte é fornecida:
Elementos de vinculação necessários
Há um grande número de elementos de ligação possíveis que podem ser combinados em uma ligação. Nem todas estas combinações são válidas. Esta seção descreve os elementos necessários que devem estar presentes em uma associação de segurança.
As associações de segurança válidas dependem de muitos fatores, incluindo os seguintes:
Modo de segurança.
Protocolo de transporte.
O padrão de troca de mensagens (MEP) especificado no contrato.
A tabela a seguir mostra as configurações válidas da pilha de elementos de ligação para cada combinação dos fatores anteriores. Tenha em atenção que estes são requisitos mínimos. Você pode adicionar elementos de vinculação adicionais à associação, como elementos de vinculação de codificação de mensagem, elementos de vinculação de transação e outros elementos de vinculação.
Modo de Segurança | Transporte | Padrão de troca de mensagens de contrato | Padrão de troca de mensagens de contrato | Padrão de troca de mensagens de contrato |
---|---|---|---|---|
Datagram |
Request Reply |
Duplex |
||
Transporte | Disponível em: | |||
OneWayBindingElement | ||||
HttpsTransportBindingElement | HttpsTransportBindingElement | |||
TCP | ||||
OneWayBindingElement | ||||
SSL ou Windows StreamSecurityBindingElement | SSL ou Windows StreamSecurityBindingElement | SSL ou Windows StreamSecurityBindingElement | ||
TcpTransportBindingElement | TcpTransportBindingElement | TcpTransportBindingElement | ||
Mensagem | Http | SymmetricSecurityBindingElement | SymmetricSecurityBindingElement | SymmetricSecurityBindingElement (modo de autenticação = SecureConversation) |
CompositeDuplexBindingElement | ||||
OneWayBindingElement | OneWayBindingElement | |||
HttpTransportBindingElement | HttpTransportBindingElement | HttpTransportBindingElement | ||
TCP | SecurityBindingElement | SecurityBindingElement | SymmetricSecurityBindingElement (modo de autenticação = SecureConversation) | |
TcpTransportBindingElement | TcpTransportBindingElement | TcpTransportBindingElement | ||
Misto (transporte com credenciais de mensagem) | Disponível em: | TransportSecurityBindingElement | TransportSecurityBindingElement | |
OneWayBindingElement | ||||
HttpsTransportBindingElement | HttpsTransportBindingElement | |||
TCP | TransportSecurityBindingElement | SymmetricSecurityBindingElement (modo de autenticação = SecureConversation) | SymmetricSecurityBindingElement (modo de autenticação = SecureConversation) | |
OneWayBindingElement | ||||
SSL ou Windows StreamSecurityBindingElement | SSL ou Windows StreamSecurityBindingElement | SSL ou Windows StreamSecurityBindingElement | ||
TcpTransportBindingElement | TcpTransportBindingElement | TcpTransportBindingElement |
Observe que há muitas configurações configuráveis no SecurityBindingElements. Para obter mais informações, consulte Modos de autenticação SecurityBindingElement.
Para obter mais informações, consulte Conversas seguras e sessões seguras.
Procedimentos
Para criar uma associação personalizada que usa um SymmetricSecurityBindingElement
Crie uma instância da BindingElementCollection classe com o nome
outputBec
.Chame o método
M:System.ServiceModel.Channels.SecurityBindingElement.CreateSspiNegotiationBindingElement(true)
estático , que retorna uma instância da SymmetricSecurityBindingElement classe.Adicione o SymmetricSecurityBindingElement à coleção (
outputBec
) chamando oAdd
método da Collection<T> classe of BindingElement .Crie uma instância da classe e adicione-a TextMessageEncodingBindingElement à coleção (
outputBec
). Isso especifica a codificação usada pela associação.Crie um HttpTransportBindingElement e adicione-o à coleção (
outputBec
). Isso especifica que a associação usa o transporte HTTP.Crie uma nova associação personalizada criando uma instância da CustomBinding classe e passando a coleção
outputBec
para o construtor.A vinculação personalizada resultante compartilha muitas das mesmas características que o padrão WSHttpBinding. Ele especifica a segurança no nível da mensagem e as credenciais do Windows, mas desabilita sessões seguras, exige que a credencial de serviço seja especificada fora da banda e não criptografa assinaturas. O último pode ser controlado apenas definindo a propriedade, MessageProtectionOrder conforme mostrado na etapa 4. Os outros dois podem ser controlados usando configurações na vinculação padrão.
Exemplo
Description
O exemplo a seguir fornece uma função completa para criar uma associação personalizada que usa um SymmetricSecurityBindingElementarquivo .
Código
// 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