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)

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

Свойства

Имя Описание
IdentityVerifier

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

RequireClientCertificate

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

SslProtocols

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

Методы

Имя Описание
BuildChannelFactory<TChannel>(BindingContext)

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

BuildChannelListener<TChannel>(BindingContext)

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

BuildClientStreamUpgradeProvider(BindingContext)

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

BuildServerStreamUpgradeProvider(BindingContext)

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

CanBuildChannelFactory<TChannel>(BindingContext)

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

CanBuildChannelListener<TChannel>(BindingContext)

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

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)

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

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