SslStreamSecurityBindingElement Klasse

Definition

Stellt ein benutzerdefiniertes Bindungselement dar, das die Kanalsicherheit mit einem SSL-Stream unterstützt.

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
Vererbung
SslStreamSecurityBindingElement
Vererbung
SslStreamSecurityBindingElement
Implementiert

Hinweise

Transporte, die ein streamorientiertes Protokoll wie TCP und Named Pipes verwenden, unterstützen streambasierte Transportupgrades. Insbesondere bietet Windows Communication Foundation (WCF) Sicherheitsupgrades. Die Konfiguration dieser Transportsichersicherheit wird durch diese Klasse sowie durch das SslStreamSecurityBindingElement gekapselt, die konfiguriert und einer benutzerdefinierten Bindung hinzugefügt werden können. Außerdem können Drittanbieter ihr eigenes benutzerdefiniertes StreamSecurityBindingElement schreiben. Diese Bindungselemente erweitern die StreamUpgradeBindingElement-Klasse, die zum Erstellen der Client- und Server-Streamupgradeanbieter aufgerufen wird.

Eine benutzerdefinierte Bindung enthält eine Auflistung von Bindungselementen, die in einer bestimmten Reihenfolge angeordnet sind: Das Element, das das erste Element des Bindungsstapels darstellt, wird zuerst hinzugefügt, das darauf folgende Element wird als zweites hinzugefügt usw.

So fügen Sie diese Klasse einer Bindung hinzu

  1. Erstellen Sie eine BindingElementCollection.

  2. Erstellen Sie benutzerdefinierte Bindungselemente, die sich im Bindungsstapel über diesem Bindungselement befinden, wie zum Beispiel das optionale TransactionFlowBindingElement und ReliableSessionBindingElement.

  3. Fügen Sie die erstellten Elemente in der zuvor beschriebenen Reihenfolge zu BindingElementCollection hinzu, indem Sie die InsertItem-Methode verwenden.

  4. Erstellen Sie eine Instanz von SslStreamSecurityBindingElement, und fügen Sie sie zur Auflistung hinzu.

  5. Fügen Sie weitere benutzerdefinierte Bindungselemente zur Auflistung hinzu, wie zum Beispiel TcpTransportBindingElement.

Es gibt drei Szenarien, in denen Sie entweder den richtigen UPN/SPN auf dem Clientendpunkt nach dem Importieren der WSDL manuell angeben oder einen benutzerdefinierten IdentityVerifier auf dem Client-Endpunkt SslStreamSecurityBindingElementangeben müssen.

  1. Es wird keine Dienstidentität in WSDL veröffentlicht. SspiNegotiatedOverTransport und HTTPS werden verwendet (z. B. eine WSHttpBinding mit SecurityMode = TransportWithMessageCredential). Wenn der Dienst nicht mit der Computeridentität ausgeführt wird, müssen Sie den richtigen UPN/SPN auf dem Clientendpunkt manuell angeben, nachdem Sie die WSDL importiert haben.

  2. Die DNS-Dienstidentität wird in WSDL veröffentlicht. SspiNegotiatedOverTransport und SslStreamSecurityBindingElement werden (z. B. NetTcpBinding mit SecurityMode = TransportWithMessageCredential) anstelle eines UPN/SPN verwendet. Wenn der Dienst nicht mit der Computeridentität ausgeführt wird oder die DNS-Identität nicht der Computeridentität entspricht, müssen Sie den richtigen UPN/SPN auf dem Clientendpunkt manuell angeben, nachdem Sie die WSDL importiert haben.

  3. Die DNS-Identität wird in WSDL veröffentlicht. Wenn SslStreamSecurityBindingElement auf dem Client überschrieben wird, müssen Sie für das IdentityVerifier des Clients einen benutzerdefinierten SslStreamSecurityBindingElement angeben.

Im folgenden Code wird gezeigt, wie der richtige UPN/SPN manuell auf dem Clientendpunkt angegeben wird und wie ein benutzerdefinierter IdentityVerifier für das SslStreamSecurityBindingElement des Clients angegeben wird.

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

Konstruktoren

SslStreamSecurityBindingElement()

Initialisiert eine neue Instanz der SslStreamSecurityBindingElement-Klasse.

SslStreamSecurityBindingElement(SslStreamSecurityBindingElement)

Initialisiert eine neue Instanz der SslStreamSecurityBindingElement-Klasse mithilfe der Werte eines anderen SslStreamSecurityBindingElement.

Eigenschaften

IdentityVerifier

Ruft die Identitätsüberprüfung für diese Bindung ab oder legt sie fest.

RequireClientCertificate

Ruft einen Wert ab oder legt einen Wert fest, der angibt, ob für diese Bindung ein Clientzertifikat erforderlich ist.

SslProtocols

Gibt die Liste der bei Verwendung des Client-Anmeldeinformationstyps "TcpClientCredentialType.Certificate" auszuhandelnden SSL/TLS-Protokolle an. Der Wert kann eine Kombination aus einem oder mehreren der folgenden Enumerationsmember sein: Ssl3, Tls, Tls11, Tls12.

Methoden

BuildChannelFactory<TChannel>(BindingContext)

Erstellt eine Kanalfactory eines angegebenen Typs.

BuildChannelListener<TChannel>(BindingContext)

Erstellt einen Kanallistener eines angegebenen Typs.

BuildChannelListener<TChannel>(BindingContext)

Initialisiert einen Kanallistener, der Kanäle eines bestimmten Typs aus dem Bindungskontext annimmt.

(Geerbt von BindingElement)
BuildClientStreamUpgradeProvider(BindingContext)

Erstellt basierend auf dem bereitgestellten Kanalkontext eine Instanz auf dem Client des StreamUpgradeProvider.

BuildServerStreamUpgradeProvider(BindingContext)

Erstellt basierend auf dem bereitgestellten Kanalkontext eine Instanz auf dem Server des StreamUpgradeProvider.

BuildServerStreamUpgradeProvider(BindingContext)

Erstellt basierend auf dem bereitgestellten Kanalkontext eine Instanz auf dem Server des StreamUpgradeProvider.

(Geerbt von StreamUpgradeBindingElement)
CanBuildChannelFactory<TChannel>(BindingContext)

Ruft einen Wert ab, der angibt, ob eine Kanalfactory des angegebenen Kanaltyps erstellt werden kann.

CanBuildChannelListener<TChannel>(BindingContext)

Ruft einen Wert ab, der angibt, ob ein Kanallistener des angegebenen Typs erstellt werden kann.

CanBuildChannelListener<TChannel>(BindingContext)

Gibt einen Wert zurück, der angibt, ob das Bindungselement einen Listener für einen bestimmten Typ von Kanal erstellen kann.

(Geerbt von BindingElement)
Clone()

Erstellt eine neue Instanz, die eine Kopie der aktuellen Instanz darstellt.

Equals(Object)

Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist.

(Geerbt von Object)
GetHashCode()

Fungiert als Standardhashfunktion.

(Geerbt von Object)
GetProperty<T>(BindingContext)

Ruft ein angegebenes Objekt aus dem BindingContext ab.

GetTransportTokenAssertion()

Ruft das XmlElement ab, das das Transporttoken darstellt, das in der Sicherheitsbindung verwendet wird.

GetType()

Ruft den Type der aktuellen Instanz ab.

(Geerbt von Object)
MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.

(Geerbt von Object)
ShouldSerializeIdentityVerifier()

Ruft einen Wert ab, der angibt, ob die Identitätsüberprüfung serialisiert werden soll.

ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)

Explizite Schnittstellenimplementierungen

IPolicyExportExtension.ExportPolicy(MetadataExporter, PolicyConversionContext)

Exportiert eine benutzerdefinierte Richtlinienassertion über Bindungen.

Gilt für: