Condividi tramite


SslStreamSecurityBindingElement Classe

Definizione

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

Commenti

I trasporti che usano un protocollo orientato al flusso, ad esempio TCP e named pipe, supportano aggiornamenti del trasporto basati sul flusso. In particolare, Windows Communication Foundation (WCF) fornisce aggiornamenti della sicurezza. La configurazione della sicurezza a livello di trasporto viene incapsulata da questa classe e dalla classe SslStreamSecurityBindingElement, che possono essere configurate e aggiunte a un'associazione personalizzata. Inoltre, una terza parte può scrivere i propri StreamSecurityBindingElement personalizzati. Questi elementi di associazione estendono la classe StreamUpgradeBindingElement che viene chiamata per compilare i provider di aggiornamento flusso client e server.

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

Per aggiungere questa classe a un'associazione

  1. Creare un oggetto BindingElementCollection.

  2. Creare elementi di associazione personalizzati che si trovino prima di questo elemento di associazione nello stack dell'associazione, ad esempio gli elementi facoltativi TransactionFlowBindingElement e ReliableSessionBindingElement.

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

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

  5. Aggiungere alla raccolta qualsiasi elemento di associazione personalizzato aggiuntivo, 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. Non viene pubblicata nessuna identità del servizio in WSDL. Vengono utilizzati SspiNegotiatedOverTransport e Https (ad esempio, un oggetto WSHttpBinding con SecurityMode = TransportWithMessageCredential). Se il servizio non è in esecuzione con l'identità del computer, è necessario specificare manualmente l'UPN/SPN corretto sull'endpoint client dopo avere importato WSDL.

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

  3. L'identità DNS viene pubblicata in WSDL. Se SslStreamSecurityBindingElement viene ignorato sul client, è necessario specificare un oggetto IdentityVerifier personalizzato su SslStreamSecurityBindingElement del client.

Nel codice seguente viene mostrato come specificare manualmente l'UPN/SPN corretto sull'endpoint client, così come specificare un oggetto IdentityVerifier personalizzato su SslStreamSecurityBindingElement del client.

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

SslStreamSecurityBindingElement()

Inizializza una nuova istanza della classe SslStreamSecurityBindingElement.

SslStreamSecurityBindingElement(SslStreamSecurityBindingElement)

Inizializza una nuova istanza della classe SslStreamSecurityBindingElement usando i valori relativi a un'altra classe SslStreamSecurityBindingElement.

Proprietà

IdentityVerifier

Ottiene o imposta il verificatore di identità per questo binding.

RequireClientCertificate

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

SslProtocols

Specifica l'elenco dei protocolli SSL/TLS per negoziare quando si usa un tipo di credenziale client di TcpClientCredentialType.Certificate. Il valore può essere una combinazione di uno o più dei seguenti membri dell'enumerazione: Ssl3, Tls, Tls11, Tls12.

Metodi

BuildChannelFactory<TChannel>(BindingContext)

Crea una channel factory di un tipo specificato.

BuildChannelListener<TChannel>(BindingContext)

Crea un listener del canale di un tipo specificato.

BuildChannelListener<TChannel>(BindingContext)

Inizializza un listener del canale per accettare canali di un tipo specificato dal contesto dell'associazione.

(Ereditato da BindingElement)
BuildClientStreamUpgradeProvider(BindingContext)

Crea un'istanza nel client di StreamUpgradeProvider basata sul contesto del canale fornito.

BuildServerStreamUpgradeProvider(BindingContext)

Crea un'istanza nel server di StreamUpgradeProvider basata sul contesto del canale fornito.

BuildServerStreamUpgradeProvider(BindingContext)

Crea un'istanza nel server di StreamUpgradeProvider basata sul contesto del canale fornito.

(Ereditato da StreamUpgradeBindingElement)
CanBuildChannelFactory<TChannel>(BindingContext)

Ottiene un valore che indica se può essere compilata una channel factory del tipo specificato.

CanBuildChannelListener<TChannel>(BindingContext)

Ottiene un valore che indica se può essere compilato un listener del canale del tipo specificato.

CanBuildChannelListener<TChannel>(BindingContext)

Restituisce un valore che indica se l'elemento di associazione può compilare un listener per un tipo di canale specifico.

(Ereditato da BindingElement)
Clone()

Crea una nuova istanza che è 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 da BindingContext.

GetTransportTokenAssertion()

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

GetType()

Ottiene l'oggetto Type dell'istanza corrente.

(Ereditato da Object)
MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.

(Ereditato da Object)
ShouldSerializeIdentityVerifier()

Ottiene un valore che indica se è necessario serializzare il sistema di verifica di identità.

ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)

Implementazioni dell'interfaccia esplicita

IPolicyExportExtension.ExportPolicy(MetadataExporter, PolicyConversionContext)

Esporta un'asserzione di criteri personalizzata relativa ad associazioni.

Si applica a