SslStreamSecurityBindingElement Clase

Definición

Representa un elemento de enlace personalizado que admite seguridad del canal mediante una secuencia de 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
Herencia
SslStreamSecurityBindingElement
Herencia
SslStreamSecurityBindingElement
Implementaciones

Comentarios

Transportes que utilizan un protocolo orientado a secuencias como TCP y canalizaciones con nombre que admiten las actualizaciones de transporte basadas en secuencias. En concreto, Windows Communication Foundation (WCF) proporciona actualizaciones de seguridad. La configuración de esta seguridad de transporte es encapsulada por esta clase así como por SslStreamSecurityBindingElement, que se puede configurar y se puede agregar a un enlace personalizado. Además, un tercero puede escribir su propio StreamSecurityBindingElement personalizado. Estos elementos de enlace extienden la clase StreamUpgradeBindingElement a la que se llama para crear los proveedores de actualización de secuencia del cliente y el servidor.

Un enlace personalizado contiene una colección de elementos de enlace organizada en un orden específico: primero se agrega el elemento que representa la parte superior de la pila de enlace, el elemento siguiente en la pila de enlace se agrega en segundo lugar, etc.

Para agregar esta clase a un enlace

  1. Creará un control BindingElementCollection.

  2. Cree elementos de enlace personalizados que sean anteriores a este elemento de enlace en la pila de enlace, como el TransactionFlowBindingElement opcional y ReliableSessionBindingElement.

  3. Agregue los elementos creados, en el orden descrito previamente, a BindingElementCollection utilizando el método InsertItem.

  4. Cree una instancia de SslStreamSecurityBindingElement y agréguela a la colección.

  5. Agregue cualquier elemento de enlace personalizado adicional a la colección, como la clase TcpTransportBindingElement.

Hay tres escenarios en los que debe especificar manualmente el UPN/SPN correcto en el punto de conexión de cliente después de importar el WSDL, o especificar un personalizado IdentityVerifier en el cliente.SslStreamSecurityBindingElement

  1. No se publica ninguna identidad de servicio en WSDL. Se usan SspiNegotiatedOverTransport y HTTPS (por ejemplo, una clase WSHttpBinding con SecurityMode = TransportWithMessageCredential). Si el servicio no se ejecuta con la identidad de la máquina, debe especificar manualmente el UPN o el SPN correctos en el extremo de cliente después de importar el WSDL.

  2. La identidad del servicio DNS se publica en WSDL. SspiNegotiatedOverTransport y SslStreamSecurityBindingElement se usan (por ejemplo, NetTcpBinding con SecurityMode = TransportWithMessageCredential) en lugar de un UPN/SPN. Si el servicio no se ejecuta con la identidad de la máquina, o la identidad del DNS no es la identidad de la máquina, debe especificar manualmente el UPN o el SPN correctos en el punto de conexión de cliente después de importar el WSDL.

  3. La identidad de DNS se publica en WSDL. Si la clase SslStreamSecurityBindingElement se invalida en el cliente, debe especificar una clase IdentityVerifier personalizada en la clase SslStreamSecurityBindingElement del cliente.

En el código siguiente se muestra cómo especificar manualmente el UPN o el SPN correctos en el extremo de cliente y cómo especificar una clase IdentityVerifier personalizada en la clase SslStreamSecurityBindingElement del cliente.

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();  
        }  
    }  

Constructores

SslStreamSecurityBindingElement()

Inicializa una nueva instancia de la clase SslStreamSecurityBindingElement.

SslStreamSecurityBindingElement(SslStreamSecurityBindingElement)

Inicializa una nueva instancia de la clase SslStreamSecurityBindingElement con los valores de otro SslStreamSecurityBindingElement.

Propiedades

IdentityVerifier

Obtiene o establece el comprobador de identidad para este enlace.

RequireClientCertificate

Obtiene o establece un valor que especifica si un certificado de cliente es necesario para este enlace.

SslProtocols

Especifica la lista de protocolos SSL/TLS para negociar cuándo se usa un tipo de credencial de cliente de TcpClientCredentialType.Certificate. El valor puede ser una combinación de uno o varios de los siguientes miembros de enumeración: Ssl3, Tls, Tls11, Tls12.

Métodos

BuildChannelFactory<TChannel>(BindingContext)

Crea un generador de canales del tipo especificado.

BuildChannelListener<TChannel>(BindingContext)

Crea una escucha del canal del tipo especificado.

BuildChannelListener<TChannel>(BindingContext)

Inicializa una escucha de canales para aceptar canales de un tipo especificado a partir del contexto de enlace.

(Heredado de BindingElement)
BuildClientStreamUpgradeProvider(BindingContext)

Crea una instancia en el cliente de StreamUpgradeProvider basada en el contexto del canal proporcionado.

BuildServerStreamUpgradeProvider(BindingContext)

Crea una instancia en el servidor de StreamUpgradeProvider basada en el contexto del canal proporcionado.

BuildServerStreamUpgradeProvider(BindingContext)

Crea una instancia en el servidor de StreamUpgradeProvider basada en el contexto del canal proporcionado.

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

Obtiene un valor que indica si se puede crear un generador de canales del tipo especificado.

CanBuildChannelListener<TChannel>(BindingContext)

Obtiene un valor que indica si se puede crear una escucha del canal del tipo especificado.

CanBuildChannelListener<TChannel>(BindingContext)

Devuelve un valor que indica si el elemento de enlace puede compilar una escucha para un tipo específico de canal.

(Heredado de BindingElement)
Clone()

Crea una nueva instancia que es una copia de la instancia actual.

Equals(Object)

Determina si el objeto especificado es igual que el objeto actual.

(Heredado de Object)
GetHashCode()

Sirve como la función hash predeterminada.

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

Obtiene un objeto especificado a partir de BindingContext.

GetTransportTokenAssertion()

Obtiene XmlElement que representa el token de transporte utilizado en el enlace de seguridad.

GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
ShouldSerializeIdentityVerifier()

Obtiene un valor que indica si el comprobador de identidad debe serializarse.

ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)

Implementaciones de interfaz explícitas

IPolicyExportExtension.ExportPolicy(MetadataExporter, PolicyConversionContext)

Exporta una aserción de directiva personalizada sobre los enlaces.

Se aplica a