Como: criar uma associação personalizada utilizando o SecurityBindingElement

O WCF (Windows Communication Foundation) 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 compatíveis com o WCF. Este tópico demonstra como criar uma associação personalizada diretamente de elementos de associaçã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 associações personalizadas, consulte Estender associações.

Aviso

SecurityBindingElement não dá suporte à forma do canal IDuplexSessionChannel, que é a forma de canal padrão usada pelo transporte TCP quando TransferMode é definido como Buffered. Você deve definir TransferMode como Streamed para usar SecurityBindingElement nesse cenário.

Criar uma associação personalizada

No WCF, todas as associações são compostas por elementos de associação. Cada elemento de associação deriva da classe BindingElement. Para as associações padrão fornecidas pelo sistema, os elementos de associaçã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 associação são criados e configurados e um CustomBinding é criado a partir dos elementos de associação.

Para fazer isso, adicione os elementos de associação individuais a uma coleção representada por uma instância da classe BindingElementCollection e defina a propriedade Elements do CustomBinding igual a esse objeto. Você deve adicionar os elementos de associação na seguinte ordem: Fluxo de Transação, Sessão Confiável, Segurança, Duplex Composto, Unidirecional, Segurança de Fluxo, Codificação de Mensagens e Transporte. Observe que nem todos os elementos de associação listados são necessários em cada associação.

SecurityBindingElement

Três elementos de associação estão relacionados à segurança no nível da mensagem, todos derivados da classe SecurityBindingElement. São eles TransportSecurityBindingElement, SymmetricSecurityBindingElement e AsymmetricSecurityBindingElement. O TransportSecurityBindingElement é usado para fornecer segurança no 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 no nível do transporte é fornecida:

Elementos de associação obrigatórios

Há um grande número de elementos de associação possíveis que podem ser combinados em uma associação. Nem todas essas 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 o seguinte:

  • 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 de pilha de elementos de associação válidas para cada combinação dos fatores anteriores. Observe que esses requisitos são mínimos. Você pode adicionar elementos de associação adicionais à associação, como elementos de associação de codificação de mensagens, elementos de associação de transação e outros elementos de associação.

Modo de segurança Transport 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
Transport Https
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) Https 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 definiçõ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

  1. Crie uma instância da classe BindingElementCollection com o nome outputBec.

  2. Chame o método estático M:System.ServiceModel.Channels.SecurityBindingElement.CreateSspiNegotiationBindingElement(true), que retorna uma instância da classe SymmetricSecurityBindingElement.

  3. Adicione o SymmetricSecurityBindingElement à coleção (outputBec) chamando o método Add do Collection<T> da classe BindingElement.

  4. Crie uma instância da classe TextMessageEncodingBindingElement e adicione-a à coleção (outputBec). Isso especifica a codificação usada pela associação.

  5. Crie um HttpTransportBindingElement e adicione-o à coleção (outputBec). Isso especifica que a associação usa o transporte HTTP.

  6. Crie uma nova associação personalizada criando uma instância da classe CustomBinding e passando a coleção outputBec para o construtor.

  7. A associaçã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 de banda e não criptografe 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 associação padrão.

Exemplo

Descrição

O exemplo a seguir fornece uma função completa para criar uma associação personalizada que usa um SymmetricSecurityBindingElement.

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

Confira também