Compartilhar via


SslStreamSecurityBindingElement Classe

Definição

Representa um elemento de associação personalizado que suporta segurança de canal usando um fluxo SSL.

public ref class SslStreamSecurityBindingElement : System::ServiceModel::Channels::BindingElement
public ref class SslStreamSecurityBindingElement : System::ServiceModel::Channels::StreamUpgradeBindingElement
public ref class SslStreamSecurityBindingElement : System::ServiceModel::Channels::StreamUpgradeBindingElement, System::ServiceModel::Channels::ITransportTokenAssertionProvider, System::ServiceModel::Description::IPolicyExportExtension
public class SslStreamSecurityBindingElement : System.ServiceModel.Channels.BindingElement
public class SslStreamSecurityBindingElement : System.ServiceModel.Channels.StreamUpgradeBindingElement
public class SslStreamSecurityBindingElement : System.ServiceModel.Channels.StreamUpgradeBindingElement, System.ServiceModel.Channels.ITransportTokenAssertionProvider, System.ServiceModel.Description.IPolicyExportExtension
type SslStreamSecurityBindingElement = class
    inherit BindingElement
type SslStreamSecurityBindingElement = class
    inherit StreamUpgradeBindingElement
type SslStreamSecurityBindingElement = class
    inherit StreamUpgradeBindingElement
    interface ITransportTokenAssertionProvider
    interface IPolicyExportExtension
Public Class SslStreamSecurityBindingElement
Inherits BindingElement
Public Class SslStreamSecurityBindingElement
Inherits StreamUpgradeBindingElement
Public Class SslStreamSecurityBindingElement
Inherits StreamUpgradeBindingElement
Implements IPolicyExportExtension, ITransportTokenAssertionProvider
Herança
SslStreamSecurityBindingElement
Herança
SslStreamSecurityBindingElement
Implementações

Comentários

Os transportes que usam um protocolo orientado a fluxo, como TCP e pipes nomeados, oferecem suporte a atualizações de transporte baseadas em fluxo. Especificamente, o WCF (Windows Communication Foundation) fornece atualizações de segurança. A configuração dessa segurança de transporte é encapsulada por essa classe, bem como por SslStreamSecurityBindingElement, que pode ser configurada e adicionada a uma associação personalizada. Além disso, um terceiro pode escrever seu próprio personalizado StreamSecurityBindingElement. Esses elementos de associação estendem a StreamUpgradeBindingElement classe que é chamada para criar os provedores de atualização de fluxo de cliente e servidor.

Uma associação personalizada contém uma coleção de elementos de associação organizados em uma ordem específica: o elemento que representa a parte superior da pilha de associação é adicionado primeiro, o próximo elemento na pilha de associação é adicionado em segundo e assim por diante.

Para adicionar essa classe a uma associação

  1. Criará um BindingElementCollection.

  2. Crie elementos de associação personalizados acima desse elemento de associação na pilha de associação, como o opcional TransactionFlowBindingElement e ReliableSessionBindingElemento .

  3. Adicione os elementos criados na ordem descrita anteriormente ao BindingElementCollection usando o InsertItem método .

  4. Crie uma instância do SslStreamSecurityBindingElement e adicione-a à coleção.

  5. Adicione elementos de associação personalizados adicionais à coleção, como TcpTransportBindingElement.

Há três cenários em que você deve especificar manualmente o UPN/SPN correto no ponto de extremidade do cliente depois de importar o WSDL ou especificar um personalizado IdentityVerifier no do SslStreamSecurityBindingElementcliente.

  1. Nenhuma identidade de serviço é publicada no WSDL. SspiNegotiatedOverTransport e HTTPS são usados (por exemplo, um WSHttpBinding com SecurityMode = TransportWithMessageCredential). Se o serviço não estiver em execução com a identidade do computador, você deverá especificar manualmente o UPN/SPN correto no ponto de extremidade do cliente depois de importar o WSDL.

  2. A identidade do serviço DNS é publicada no WSDL. SspiNegotiatedOverTransport e SslStreamSecurityBindingElement são usados (por exemplo, NetTcpBinding com SecurityMode = TransportWithMessageCredential) em vez de um UPN/SPN. Se o serviço não estiver em execução com a identidade do computador ou a identidade DNS não for a identidade do computador, você deverá especificar manualmente o UPN/SPN correto no ponto de extremidade do cliente depois de importar o WSDL.

  3. A identidade DNS é publicada no WSDL. Se SslStreamSecurityBindingElement for substituído no cliente, você deverá especificar um personalizado IdentityVerifier no do SslStreamSecurityBindingElementcliente.

O código a seguir mostra como especificar manualmente o UPN/SPN correto no ponto de extremidade do cliente, bem como especificar um personalizado IdentityVerifier no do SslStreamSecurityBindingElementcliente.

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Net;  
using System.IdentityModel.Claims;  
using System.IdentityModel.Policy;  
using System.Security.Cryptography.X509Certificates;  
using System.ServiceModel;  
using System.ServiceModel.Channels;  
using System.ServiceModel.Description;  
using System.ServiceModel.Security;  
using System.Xml;  

namespace ServiceNamespace  
{  
    [ServiceContract]  
    interface IService  
    {  
        [OperationContract]  
        void DoSomething();  
    }  

    class DnsIdentityVerifier : IdentityVerifier  
    {  
        DnsEndpointIdentity _expectedIdentity;  

        public DnsIdentityVerifier(EndpointAddress serviceEndpoint)  
        {  
            _expectedIdentity = new DnsEndpointIdentity(serviceEndpoint.Uri.DnsSafeHost);  
        }  

        public override bool CheckAccess(EndpointIdentity identity, AuthorizationContext authContext)  
        {  
            Claim dnsClaim = authContext.Claims().Single(claim => claim.ClaimType == ClaimTypes.Dns);  
            return String.Equals(_expectedIdentity.IdentityClaim.Resource, dnsClaim.Resource);  
        }  

        public override bool TryGetIdentity(EndpointAddress reference, out EndpointIdentity identity)  
        {  
            identity = _expectedIdentity;  
            return true;  
        }  
    }  

    static class LinqExtensionForClaims  
    {  
        public static IEnumerable<Claim> Claims(this AuthorizationContext authContext)  
        {  
            if (null != authContext.ClaimSets)  
            {  
                foreach (ClaimSet claimSet in authContext.ClaimSets)  
                {  
                    if (null != claimSet)  
                    {  
                        foreach (Claim claim in claimSet)  
                        {  
                            yield return claim;  
                        }  
                    }  
                }  
            }  
        }  
    }  

    class Service : IService  
    {  
        public void DoSomething()  
        {  
            Console.WriteLine("Service called.");  
        }  
    }  

    class Program  
    {  
        static void Main(string[] args)  
        {  
            string hostname = Dns.GetHostEntry(String.Empty).HostName;  
            NetTcpBinding serviceBinding = new NetTcpBinding(SecurityMode.TransportWithMessageCredential);  

            ServiceHost serviceHost = new ServiceHost(typeof(Service), new Uri(String.Format("net.tcp://{0}:8080/Service", hostname)));  
            serviceHost.Credentials.ServiceCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByThumbprint, "8a 42 1b eb cf 8a 14 b1 de 83 d9 a5 70 88 0a 62 f9 bf 69 06");  
            ServiceEndpoint serviceEndpoint = serviceHost.AddServiceEndpoint(typeof(IService), serviceBinding, "Endpoint");  
            serviceHost.Open();  

            CustomBinding clientBinding = new CustomBinding(serviceBinding.CreateBindingElements());  
            SslStreamSecurityBindingElement sslStream = clientBinding.Elements.Find<SslStreamSecurityBindingElement>();  
            sslStream.IdentityVerifier = new DnsIdentityVerifier(serviceEndpoint.Address);  

            ChannelFactory<IService> channelFactory = new ChannelFactory<IService>(clientBinding, new EndpointAddress(serviceEndpoint.Address.Uri, UpnEndpointIdentity.CreateUpnIdentity("username@domain")));  
            channelFactory.Credentials.Windows.AllowNtlm = false;  
            IService channel = channelFactory.CreateChannel();  
            channel.DoSomething();  
        }  
    }  

Construtores

SslStreamSecurityBindingElement()

Inicializa uma nova instância da classe SslStreamSecurityBindingElement.

SslStreamSecurityBindingElement(SslStreamSecurityBindingElement)

Inicializa uma nova instância da classe SslStreamSecurityBindingElement usando os valores de outro SslStreamSecurityBindingElement.

Propriedades

IdentityVerifier

Obtém ou define o verificador de identidade para esta associação.

RequireClientCertificate

Obtém ou define um valor que especifica se o certificado do cliente é necessário para esta associação.

SslProtocols

Especifica a lista de protocolos SSL/TLS a serem negociados ao usar um tipo de credencial do cliente TcpClientCredentialType.Certificate. O valor pode ser uma combinação de um ou mais dos seguintes membros de enumeração: Ssl3, Tls, Tls11 e Tls12.

Métodos

BuildChannelFactory<TChannel>(BindingContext)

Cria uma fábrica de canais de um tipo especificado.

BuildChannelListener<TChannel>(BindingContext)

Cria um ouvinte de canais de um tipo especificado.

BuildChannelListener<TChannel>(BindingContext)

Inicializa um ouvinte de canais para aceitar canais de um tipo especificado do contexto de associação.

(Herdado de BindingElement)
BuildClientStreamUpgradeProvider(BindingContext)

Cria uma instância no cliente do StreamUpgradeProvider com base no contexto do canal fornecido.

BuildServerStreamUpgradeProvider(BindingContext)

Cria uma instância no servidor do StreamUpgradeProvider com base no contexto do canal fornecido.

BuildServerStreamUpgradeProvider(BindingContext)

Cria uma instância no servidor do StreamUpgradeProvider com base no contexto do canal fornecido.

(Herdado de StreamUpgradeBindingElement)
CanBuildChannelFactory<TChannel>(BindingContext)

Obtém um valor que indica se uma fábrica de canais do tipo especificado pode ser criada.

CanBuildChannelListener<TChannel>(BindingContext)

Obtém um valor que indica se um ouvinte de canais do tipo especificado pode ser criado.

CanBuildChannelListener<TChannel>(BindingContext)

Retorna um valor que indica se o elemento de associação pode criar um ouvinte para um tipo de canal específico.

(Herdado de BindingElement)
Clone()

Cria uma nova instância que é uma cópia da instância atual.

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetHashCode()

Serve como a função de hash padrão.

(Herdado de Object)
GetProperty<T>(BindingContext)

Obtém um objeto especificado por meio do BindingContext.

GetTransportTokenAssertion()

Obtém o XmlElement que representa o token de transporte usado na associação de segurança.

GetType()

Obtém o Type da instância atual.

(Herdado de Object)
MemberwiseClone()

Cria uma cópia superficial do Object atual.

(Herdado de Object)
ShouldSerializeIdentityVerifier()

Obtém um valor que indica se o verificador de identidade deve ser serializado.

ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.

(Herdado de Object)

Implantações explícitas de interface

IPolicyExportExtension.ExportPolicy(MetadataExporter, PolicyConversionContext)

Exporta uma asserção de política personalizada sobre associações.

Aplica-se a