SslStreamSecurityBindingElement Clase

Definición

Representa un elemento de enlace personalizado que admite la seguridad del canal mediante una secuencia SSL.

public ref class SslStreamSecurityBindingElement : System::ServiceModel::Channels::BindingElement
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, System.ServiceModel.Channels.ITransportTokenAssertionProvider, System.ServiceModel.Description.IPolicyExportExtension
type SslStreamSecurityBindingElement = class
    inherit BindingElement
type SslStreamSecurityBindingElement = class
    inherit StreamUpgradeBindingElement
    interface ITransportTokenAssertionProvider
    interface IPolicyExportExtension
Public Class SslStreamSecurityBindingElement
Inherits BindingElement
Public Class SslStreamSecurityBindingElement
Inherits StreamUpgradeBindingElement
Implements IPolicyExportExtension, ITransportTokenAssertionProvider
Herencia
SslStreamSecurityBindingElement
Herencia
SslStreamSecurityBindingElement
Implementaciones

Comentarios

Los transportes que usan un protocolo orientado a flujos, como TCP y canalizaciones con nombre, admiten actualizaciones de transporte basadas en secuencias. En concreto, Windows Communication Foundation (WCF) proporciona actualizaciones de seguridad. La configuración de esta seguridad de transporte está encapsulada por esta clase, así como por SslStreamSecurityBindingElement, que se puede configurar y agregar a un enlace personalizado. Además, un tercero puede escribir su propio personalizado StreamSecurityBindingElement. Estos elementos de enlace amplían la StreamUpgradeBindingElement clase a la que se llama para compilar los proveedores de actualización de flujos de servidor y cliente.

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

Para agregar esta clase a un enlace

  1. Cree un BindingElementCollection.

  2. Cree elementos de enlace personalizados que estén encima de este elemento de enlace en la pila de enlaces, como opcional TransactionFlowBindingElement y ReliableSessionBindingElement.

  3. Agregue los elementos creados en el orden descrito anteriormente al BindingElementCollection uso del InsertItem método .

  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 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. SspiNegotiatedOverTransport y HTTPS se usan (por ejemplo, con WSHttpBinding SecurityMode = TransportWithMessageCredential). Si el servicio no se ejecuta con la identidad de la máquina, debe especificar manualmente el UPN/SPN correcto en el punto de conexión 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 DNS no es la identidad de la máquina, debe especificar manualmente el UPN o SPN correcto en el punto de conexión de cliente después de importar el WSDL.

  3. La identidad DNS se publica en WSDL. Si SslStreamSecurityBindingElement se invalida en el cliente, debe especificar un personalizado IdentityVerifier en el cliente SslStreamSecurityBindingElement.

En el código siguiente se muestra cómo especificar manualmente el UPN/SPN correcto en el punto de conexión de cliente, así como cómo especificar un personalizado IdentityVerifier en la propiedad del 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();
        }
    }

Constructores

Nombre Description
SslStreamSecurityBindingElement()

Inicializa una nueva instancia de la clase SslStreamSecurityBindingElement.

SslStreamSecurityBindingElement(SslStreamSecurityBindingElement)

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

Propiedades

Nombre Description
IdentityVerifier

Obtiene o establece el comprobador de identidad para este enlace.

RequireClientCertificate

Obtiene o establece un valor que especifica si se requiere un certificado de cliente para este enlace.

SslProtocols

Especifica la lista de protocolos SSL/TLS que se van a negociar al usar un tipo de credencial de cliente de TcpClientCredentialType.Certificate. El valor puede ser una combinación de uno de los siguientes miembros de enumeración: Ssl3, Tls, Tls11, Tls12.

Métodos

Nombre Description
BuildChannelFactory<TChannel>(BindingContext)

Crea un generador de canales de un tipo especificado.

BuildChannelListener<TChannel>(BindingContext)

Crea un agente de escucha de canal de un tipo especificado.

BuildClientStreamUpgradeProvider(BindingContext)

Crea una instancia en el cliente de StreamUpgradeProvider en función del contexto de canal proporcionado.

BuildServerStreamUpgradeProvider(BindingContext)

Crea una instancia en el servidor de StreamUpgradeProvider en función del contexto de canal proporcionado.

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 compilar un agente de escucha de canal del tipo especificado.

Clone()

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

Equals(Object)

Determina si el objeto especificado es igual al objeto actual.

(Heredado de Object)
GetHashCode()

Actúa como la función hash predeterminada.

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

Obtiene un objeto especificado de .BindingContext

GetTransportTokenAssertion()

Obtiene el XmlElement objeto 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 Objectactual.

(Heredado de Object)
ShouldSerializeIdentityVerifier()

Obtiene un valor que indica si se debe serializar el comprobador de identificación.

ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)

Implementaciones de interfaz explícitas

Nombre Description
IPolicyExportExtension.ExportPolicy(MetadataExporter, PolicyConversionContext)

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

Se aplica a