Partager via


SslStreamSecurityBindingElement Classe

Définition

Représente un élément de liaison personnalisé qui prend en charge la sécurité de canal à l'aide d'un flux 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
Héritage
SslStreamSecurityBindingElement
Héritage
SslStreamSecurityBindingElement
Implémente

Remarques

Les transports qui utilisent un protocole orienté flux de données, tel que TCP, et des canaux nommés prennent en charge les mises à niveau de transport basées sur le flux de données. Plus précisément, Windows Communication Foundation (WCF) fournit des mises à niveau de sécurité. La configuration de cette sécurité des transports est encapsulée par cette classe ainsi que par SslStreamSecurityBindingElement, qui peut être configuré et peut être ajouté à une liaison personnalisée. En outre, il est possible d'écrire son propre élément StreamSecurityBindingElement personnalisé. Ces éléments de liaison étendent la classe StreamUpgradeBindingElement qui est appelée pour générer les fournisseurs de mise à niveau de flux client et serveur.

Une liaison personnalisée contient une collection d’éléments de liaison réorganisés dans un ordre spécifique : l’élément qui représente le haut de la pile de liaison est ajouté en premier, l’élément suivant dans la pile de liaison est ajouté en deuxième position, etc.

Pour ajouter cette classe à une liaison

  1. Créez un BindingElementCollection.

  2. Créez des éléments de liaison personnalisés placés au-dessus de cet élément de liaison dans la pile de liaisons, par exemple les objets facultatifs TransactionFlowBindingElement et ReliableSessionBindingElement.

  3. Ajoutez à BindingElementCollection les éléments créés dans l'ordre décrit précédemment, à l'aide de la méthode InsertItem.

  4. Créez une instance de SslStreamSecurityBindingElement et ajoutez-la à la collection.

  5. Ajoutez tout élément de liaison personnalisé supplémentaire à la collection, tel que TcpTransportBindingElement.

Il existe trois scénarios dans lesquels vous devez spécifier manuellement l’UPN/SPN correct sur le point de terminaison client après l’importation du WSDL, ou spécifier un personnalisé IdentityVerifier sur le client SslStreamSecurityBindingElement.

  1. Aucune identité de service n'est publiée dans WSDL. SspiNegotiatedOverTransport et HTTPS sont utilisés (par exemple, un objet WSHttpBinding avec SecurityMode = TransportWithMessageCredential). Si le service ne s'exécute pas avec l'identité d'ordinateur, vous devez spécifier manuellement l'UPN/SPN correct sur le point de terminaison client après avoir importé le WSDL.

  2. L’identité du service DNS est publiée dans WSDL. SspiNegotiatedOverTransport et SslStreamSecurityBindingElement sont utilisés (par exemple, NetTcpBinding avec SecurityMode = TransportWithMessageCredential) au lieu d’un UPN/SPN. Si le service ne s'exécute pas avec l'identité d'ordinateur ou si l'identité DNS ne correspond pas à l'identité d'ordinateur, vous devez spécifier manuellement l'UPN/SPN correct sur le point de terminaison client après avoir importé le WSDL.

  3. L'identité DNS est publiée dans WSDL. Si l'objet SslStreamSecurityBindingElement est remplacé sur le client, vous devez spécifier un objet IdentityVerifier personnalisé sur l'objet SslStreamSecurityBindingElementdu client.

Le code suivant indique comment spécifier manuellement l'UPN/SPN correct sur le point de terminaison client, ainsi que comment spécifier un objet IdentityVerifier personnalisé sur l'objet SslStreamSecurityBindingElementdu 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();  
        }  
    }  

Constructeurs

SslStreamSecurityBindingElement()

Initialise une nouvelle instance de la classe SslStreamSecurityBindingElement.

SslStreamSecurityBindingElement(SslStreamSecurityBindingElement)

Initialise une nouvelle instance de la classe SslStreamSecurityBindingElement en utilisant les valeurs d’un autre SslStreamSecurityBindingElement.

Propriétés

IdentityVerifier

Obtient ou définit le vérificateur d’identité pour cette liaison.

RequireClientCertificate

Obtient ou définit une valeur qui spécifie si un certificat client est requis pour la liaison.

SslProtocols

Spécifie la liste des protocoles SSL/TLS pour négocier lors de l’utilisation du type d’informations d’identification du client TcpClientCredentialType.Certificate. La valeur peut être une combinaison d’un ou plusieurs des membres de l’énumération suivante : Ssl3, Tls, Tls11, Tls12.

Méthodes

BuildChannelFactory<TChannel>(BindingContext)

Crée une fabrication de canal d'un type spécifié.

BuildChannelListener<TChannel>(BindingContext)

Crée un écouteur de canal d'un type spécifié.

BuildChannelListener<TChannel>(BindingContext)

Initialise un écouteur de canal pour accepter les canaux d’un type donné issus du contexte de liaison.

(Hérité de BindingElement)
BuildClientStreamUpgradeProvider(BindingContext)

Crée une instance sur le client du StreamUpgradeProvider basé sur le contexte de canal fourni.

BuildServerStreamUpgradeProvider(BindingContext)

Crée une instance sur le serveur du StreamUpgradeProvider basé sur le contexte de canal fourni.

BuildServerStreamUpgradeProvider(BindingContext)

Crée une instance sur le serveur du StreamUpgradeProvider basé sur le contexte de canal fourni.

(Hérité de StreamUpgradeBindingElement)
CanBuildChannelFactory<TChannel>(BindingContext)

Obtient une valeur qui indique si une fabrication de canal du type spécifié peut être créée.

CanBuildChannelListener<TChannel>(BindingContext)

Obtient une valeur qui indique si un écouteur de canal du type spécifié peut être créé.

CanBuildChannelListener<TChannel>(BindingContext)

Retourne une valeur qui indique si l’élément de liaison peut générer un écouteur pour un type de canal spécifique.

(Hérité de BindingElement)
Clone()

Crée une nouvelle instance qui est une copie de l'instance actuelle.

Equals(Object)

Détermine si l'objet spécifié est égal à l'objet actuel.

(Hérité de Object)
GetHashCode()

Fait office de fonction de hachage par défaut.

(Hérité de Object)
GetProperty<T>(BindingContext)

Obtient un objet spécifié à partir de BindingContext.

GetTransportTokenAssertion()

Obtient XmlElement qui représente le jeton de transport utilisé dans la liaison de sécurité.

GetType()

Obtient le Type de l'instance actuelle.

(Hérité de Object)
MemberwiseClone()

Crée une copie superficielle du Object actuel.

(Hérité de Object)
ShouldSerializeIdentityVerifier()

Obtient une valeur indiquant si le vérificateur d’identité doit être sérialisé.

ToString()

Retourne une chaîne qui représente l'objet actuel.

(Hérité de Object)

Implémentations d’interfaces explicites

IPolicyExportExtension.ExportPolicy(MetadataExporter, PolicyConversionContext)

Exporte une assertion de stratégie personnalisée concernant les liaisons.

S’applique à