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
- Наследование
- Наследование
- Реализации
Комментарии
Транспорты, использующие такой поточно-ориентированный протокол, как TCP и именованные каналы, поддерживают потоковые обновления транспорта. В частности, Windows Communication Foundation (WCF) обеспечивает обновления системы безопасности. Конфигурация этой безопасности транспорта инкапсулируется этим классом так же, как и элементом привязки SslStreamSecurityBindingElement, который может быть настроен и добавлен в пользовательскую привязку. Кроме того, сторонние лица могут создавать собственные пользовательские элементы привязки StreamSecurityBindingElement
. Эти элементы привязки расширяют класс StreamUpgradeBindingElement, который вызывается для построения поставщиков обновления потока клиента и сервера.
Пользовательская привязка содержит коллекцию элементов привязки, упорядоченных определенным образом: элемент, представляющий верхнюю часть стека привязки, добавляется в первую очередь, затем — следующий нижний элемент стека привязки и т. д.
Добавление этого класса в привязку
Создайте таблицу BindingElementCollection.
Создайте элементы пользовательской привязки, которые располагаются в стеке привязки выше этого элемента привязки, например необязательные элементы TransactionFlowBindingElement и ReliableSessionBindingElement.
Добавьте созданные элементы в коллекцию BindingElementCollection в указанном выше порядке с использованием метода InsertItem.
Создайте экземпляр элемента SslStreamSecurityBindingElement и добавьте его в коллекцию.
Добавьте в коллекцию любые дополнительные элементы пользовательской привязки, такие как TcpTransportBindingElement.
Существует три сценария, в которых необходимо вручную указать правильное имя участника-пользователя или имя субъекта-службы в конечной точке клиента после импорта WSDL или указать пользовательский IdentityVerifier в клиентской SslStreamSecurityBindingElementсреде .
В WSDL не опубликован идентификатор службы. SspiNegotiatedOverTransport и HTTPS используются (например, объект WSHttpBinding, для которого SecurityMode = TransportWithMessageCredential). Если служба не работает с удостоверением компьютера, необходимо вручную задать правильное имя участника пользователя или имя участника службы на конечной точке клиента после импорта WSDL.
Удостоверение службы DNS публикуется в WSDL. SspiNegotiatedOverTransport и SslStreamSecurityBindingElement используются (например, NetTcpBinding с SecurityMode = TransportWithMessageCredential) вместо имени участника-пользователя или имени субъекта-службы. Если служба не работает с удостоверением компьютера или удостоверение DNS не является удостоверением компьютера, необходимо вручную задать правильное имя участника пользователя или имя участника службы на конечной точке клиента после импорта WSDL.
Удостоверение 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) |
Экспортирует утверждение пользовательской политики о привязках. |