SslStreamSecurityBindingElement Classe

Definizione

Rappresenta un elemento di associazione personalizzato che supporta la sicurezza del canale tramite un flusso 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
Ereditarietà
SslStreamSecurityBindingElement
Ereditarietà
SslStreamSecurityBindingElement
Implementazioni

Commenti

I trasporti che usano un protocollo orientato al flusso, ad esempio TCP e named pipe, supportano gli aggiornamenti del trasporto basati su flusso. In particolare, Windows Communication Foundation (WCF) fornisce aggiornamenti della sicurezza. La configurazione di questa sicurezza del trasporto è incapsulata da questa classe e da SslStreamSecurityBindingElement, che può essere configurata e aggiunta a un'associazione personalizzata. Inoltre, una terza parte può scrivere il proprio personalizzato StreamSecurityBindingElement. Questi elementi di associazione estendono la StreamUpgradeBindingElement classe chiamata per compilare i provider di aggiornamento del flusso client e server.

Un'associazione personalizzata contiene una raccolta di elementi di associazione disposti in un ordine specifico: l'elemento che rappresenta la parte superiore dello stack di binding viene aggiunto per primo, l'elemento successivo nello stack di binding viene aggiunto secondo e così via.

Per aggiungere questa classe a un'associazione

  1. Creare un oggetto BindingElementCollection.

  2. Creare elementi di associazione personalizzati sopra questo elemento di associazione nello stack di binding, ad esempio facoltativo TransactionFlowBindingElement e ReliableSessionBindingElement.

  3. Aggiungere gli elementi creati nell'ordine descritto in precedenza all'oggetto BindingElementCollection utilizzando il InsertItem metodo .

  4. Creare un'istanza di SslStreamSecurityBindingElement e aggiungerla alla raccolta.

  5. Aggiungere altri elementi di associazione personalizzati alla raccolta, ad esempio TcpTransportBindingElement.

Esistono tre scenari in cui è necessario specificare manualmente l'UPN/SPN corretto nell'endpoint client dopo l'importazione di WSDL oppure specificare un personalizzato IdentityVerifier nel client.SslStreamSecurityBindingElement

  1. Nessuna identità del servizio viene pubblicata in WSDL. SspiNegotiatedOverTransport e HTTPS vengono usati (ad esempio, con WSHttpBinding SecurityMode = TransportWithMessageCredential). Se il servizio non è in esecuzione con l'identità del computer, è necessario specificare manualmente l'UPN/SPN corretto nell'endpoint client dopo l'importazione del file WSDL.

  2. L'identità del servizio DNS viene pubblicata in WSDL. SspiNegotiatedOverTransport e SslStreamSecurityBindingElement vengono usati (ad esempio, NetTcpBinding con SecurityMode = TransportWithMessageCredential) invece di un UPN/SPN. Se il servizio non è in esecuzione con l'identità del computer o l'identità DNS non è l'identità del computer, è necessario specificare manualmente l'UPN/SPN corretto nell'endpoint client dopo l'importazione di WSDL.

  3. L'identità DNS viene pubblicata in WSDL. Se SslStreamSecurityBindingElement viene eseguito l'override nel client, è necessario specificare un oggetto personalizzato IdentityVerifier nel client.SslStreamSecurityBindingElement

Il codice seguente illustra come specificare manualmente l'UPN/SPN corretto nell'endpoint client, nonché come specificare un personalizzato IdentityVerifier nel client.SslStreamSecurityBindingElement

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

Costruttori

Nome Descrizione
SslStreamSecurityBindingElement()

Inizializza una nuova istanza della classe SslStreamSecurityBindingElement.

SslStreamSecurityBindingElement(SslStreamSecurityBindingElement)

Inizializza una nuova istanza della SslStreamSecurityBindingElement classe utilizzando i valori di un altro SslStreamSecurityBindingElementoggetto .

Proprietà

Nome Descrizione
IdentityVerifier

Ottiene o imposta il verificatore di identità per questa associazione.

RequireClientCertificate

Ottiene o imposta un valore che specifica se per questa associazione è necessario un certificato client.

SslProtocols

Specifica l'elenco dei protocolli SSL/TLS da negoziare quando si usa un tipo di credenziale client tcpClientCredentialType.Certificate. Il valore può essere una combinazione di uno degli altri membri di enumerazione seguenti: Ssl3, Tls, Tls11, Tls12.

Metodi

Nome Descrizione
BuildChannelFactory<TChannel>(BindingContext)

Crea una channel factory di un tipo specificato.

BuildChannelListener<TChannel>(BindingContext)

Crea un listener di canale di un tipo specificato.

BuildClientStreamUpgradeProvider(BindingContext)

Crea un'istanza nel client di in StreamUpgradeProvider base al contesto del canale fornito.

BuildServerStreamUpgradeProvider(BindingContext)

Crea un'istanza nel server di StreamUpgradeProvider in base al contesto del canale fornito.

CanBuildChannelFactory<TChannel>(BindingContext)

Ottiene un valore che indica se è possibile compilare una channel factory del tipo specificato.

CanBuildChannelListener<TChannel>(BindingContext)

Ottiene un valore che indica se è possibile compilare un listener del canale del tipo specificato.

Clone()

Crea una nuova istanza di che rappresenta una copia dell'istanza corrente.

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.

(Ereditato da Object)
GetHashCode()

Funge da funzione hash predefinita.

(Ereditato da Object)
GetProperty<T>(BindingContext)

Ottiene un oggetto specificato dall'oggetto BindingContext.

GetTransportTokenAssertion()

Ottiene l'oggetto XmlElement che rappresenta il token di trasporto utilizzato nell'associazione di sicurezza.

GetType()

Ottiene il Type dell'istanza corrente.

(Ereditato da Object)
MemberwiseClone()

Crea una copia superficiale del Objectcorrente.

(Ereditato da Object)
ShouldSerializeIdentityVerifier()

Ottiene un valore che indica se il verificatore di identificazione deve essere serializzato.

ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)

Implementazioni dell'interfaccia esplicita

Nome Descrizione
IPolicyExportExtension.ExportPolicy(MetadataExporter, PolicyConversionContext)

Esporta un'asserzione di criteri personalizzata sulle associazioni.

Si applica a