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) |
Инициализирует новый экземпляр класса, используя значения из другого 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) |
Экспортирует утверждение настраиваемой политики о привязках. |