Поделиться через


SslStreamSecurityBindingElement Класс

Определение

Представляет пользовательский элемент привязки, который поддерживает безопасность канала с помощью потока 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
Наследование
SslStreamSecurityBindingElement
Наследование
SslStreamSecurityBindingElement
Реализации

Комментарии

Транспорты, использующие такой поточно-ориентированный протокол, как TCP и именованные каналы, поддерживают потоковые обновления транспорта. В частности, Windows Communication Foundation (WCF) обеспечивает обновления системы безопасности. Конфигурация этой безопасности транспорта инкапсулируется этим классом так же, как и элементом привязки SslStreamSecurityBindingElement, который может быть настроен и добавлен в пользовательскую привязку. Кроме того, сторонние лица могут создавать собственные пользовательские элементы привязки StreamSecurityBindingElement. Эти элементы привязки расширяют класс StreamUpgradeBindingElement, который вызывается для построения поставщиков обновления потока клиента и сервера.

Пользовательская привязка содержит коллекцию элементов привязки, упорядоченных определенным образом: элемент, представляющий верхнюю часть стека привязки, добавляется в первую очередь, затем — следующий нижний элемент стека привязки и т. д.

Добавление этого класса в привязку

  1. Создайте таблицу BindingElementCollection.

  2. Создайте элементы пользовательской привязки, которые располагаются в стеке привязки выше этого элемента привязки, например необязательные элементы TransactionFlowBindingElement и ReliableSessionBindingElement.

  3. Добавьте созданные элементы в коллекцию BindingElementCollection в указанном выше порядке с использованием метода InsertItem.

  4. Создайте экземпляр элемента SslStreamSecurityBindingElement и добавьте его в коллекцию.

  5. Добавьте в коллекцию любые дополнительные элементы пользовательской привязки, такие как TcpTransportBindingElement.

Существует три сценария, в которых необходимо вручную указать правильное имя участника-пользователя или имя субъекта-службы в конечной точке клиента после импорта WSDL или указать пользовательский IdentityVerifier в клиентской SslStreamSecurityBindingElementсреде .

  1. В WSDL не опубликован идентификатор службы. SspiNegotiatedOverTransport и HTTPS используются (например, объект WSHttpBinding, для которого SecurityMode = TransportWithMessageCredential). Если служба не работает с удостоверением компьютера, необходимо вручную задать правильное имя участника пользователя или имя участника службы на конечной точке клиента после импорта WSDL.

  2. Удостоверение службы DNS публикуется в WSDL. SspiNegotiatedOverTransport и SslStreamSecurityBindingElement используются (например, NetTcpBinding с SecurityMode = TransportWithMessageCredential) вместо имени участника-пользователя или имени субъекта-службы. Если служба не работает с удостоверением компьютера или удостоверение DNS не является удостоверением компьютера, необходимо вручную задать правильное имя участника пользователя или имя участника службы на конечной точке клиента после импорта WSDL.

  3. Удостоверение DNS опубликовано в WSDL. Если элемент SslStreamSecurityBindingElement переопределяется на клиенте, необходимо задать пользовательский параметр IdentityVerifier на элементе клиента SslStreamSecurityBindingElement.

В следующем коде показано, как вручную задать правильное имя участника пользователя или имя участника службы на конечной точке клиента, а также задать пользовательский параметр IdentityVerifier на элементе клиента 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();  
        }  
    }  

Конструкторы

SslStreamSecurityBindingElement()

Инициализирует новый экземпляр класса SslStreamSecurityBindingElement.

SslStreamSecurityBindingElement(SslStreamSecurityBindingElement)

Инициализирует новый экземпляр класса SslStreamSecurityBindingElement, используя значения из другого объекта SslStreamSecurityBindingElement.

Свойства

IdentityVerifier

Возвращает или задает средство проверки удостоверения для этой привязки.

RequireClientCertificate

Возвращает или задает значение, указывающее, требуется ли для этой привязки сертификат клиента.

SslProtocols

Указывает список протоколов SSL/TLS для согласования при использовании типа TcpClientCredentialType.Certificate учетных данных клиента. Значение может представлять собой сочетание одного или нескольких из следующих элементов перечисления: Ssl3, Tls, Tls11, Tls12.

Методы

BuildChannelFactory<TChannel>(BindingContext)

Создает фабрику каналов заданного типа.

BuildChannelListener<TChannel>(BindingContext)

Создает прослушиватель каналов заданного типа.

BuildChannelListener<TChannel>(BindingContext)

Инициализирует прослушиватель каналов для приема каналов заданного типа из контекста привязки.

(Унаследовано от BindingElement)
BuildClientStreamUpgradeProvider(BindingContext)

Создает экземпляр в клиенте поставщика StreamUpgradeProvider на основе предоставленного контекста канала.

BuildServerStreamUpgradeProvider(BindingContext)

Создает на сервере экземпляр класса StreamUpgradeProvider на основе предоставленного контекста канала.

BuildServerStreamUpgradeProvider(BindingContext)

Создает на сервере экземпляр класса StreamUpgradeProvider на основе предоставленного контекста канала.

(Унаследовано от StreamUpgradeBindingElement)
CanBuildChannelFactory<TChannel>(BindingContext)

Возвращает значение, определяющее, можно ли создать фабрику каналов указанного типа.

CanBuildChannelListener<TChannel>(BindingContext)

Возвращает значение, определяющее, можно ли создать прослушиватель каналов указанного типа.

CanBuildChannelListener<TChannel>(BindingContext)

Возвращает значение, показывающее, может ли элемент привязки создать прослушиватель для заданного типа канала.

(Унаследовано от BindingElement)
Clone()

Создает новый экземпляр, который является копией текущего экземпляра.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetProperty<T>(BindingContext)

Возвращает указанный объект из объекта BindingContext.

GetTransportTokenAssertion()

Возвращает XmlElement, представляющий маркер транспорта, который используется в привязке безопасности.

GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
ShouldSerializeIdentityVerifier()

Возвращает значение, указывающее, нужно ли выполнять сериализацию средства проверки удостоверений.

ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Явные реализации интерфейса

IPolicyExportExtension.ExportPolicy(MetadataExporter, PolicyConversionContext)

Экспортирует утверждение пользовательской политики о привязках.

Применяется к