SslStreamSecurityBindingElement Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Representa um elemento de associação personalizado que suporta segurança de canal usando um fluxo 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
- Herança
- Herança
- Implementações
Comentários
Os transportes que usam um protocolo orientado a fluxo, como TCP e pipes nomeados, oferecem suporte a atualizações de transporte baseadas em fluxo. Especificamente, o WCF (Windows Communication Foundation) fornece atualizações de segurança. A configuração dessa segurança de transporte é encapsulada por essa classe, bem como por SslStreamSecurityBindingElement, que pode ser configurada e adicionada a uma associação personalizada. Além disso, um terceiro pode escrever seu próprio personalizado StreamSecurityBindingElement
. Esses elementos de associação estendem a StreamUpgradeBindingElement classe que é chamada para criar os provedores de atualização de fluxo de cliente e servidor.
Uma associação personalizada contém uma coleção de elementos de associação organizados em uma ordem específica: o elemento que representa a parte superior da pilha de associação é adicionado primeiro, o próximo elemento na pilha de associação é adicionado em segundo e assim por diante.
Para adicionar essa classe a uma associação
Criará um BindingElementCollection.
Crie elementos de associação personalizados acima desse elemento de associação na pilha de associação, como o opcional TransactionFlowBindingElement e ReliableSessionBindingElemento .
Adicione os elementos criados na ordem descrita anteriormente ao BindingElementCollection usando o InsertItem método .
Crie uma instância do SslStreamSecurityBindingElement e adicione-a à coleção.
Adicione elementos de associação personalizados adicionais à coleção, como TcpTransportBindingElement.
Há três cenários em que você deve especificar manualmente o UPN/SPN correto no ponto de extremidade do cliente depois de importar o WSDL ou especificar um personalizado IdentityVerifier no do SslStreamSecurityBindingElementcliente.
Nenhuma identidade de serviço é publicada no WSDL. SspiNegotiatedOverTransport e HTTPS são usados (por exemplo, um WSHttpBinding com SecurityMode = TransportWithMessageCredential). Se o serviço não estiver em execução com a identidade do computador, você deverá especificar manualmente o UPN/SPN correto no ponto de extremidade do cliente depois de importar o WSDL.
A identidade do serviço DNS é publicada no WSDL. SspiNegotiatedOverTransport e SslStreamSecurityBindingElement são usados (por exemplo, NetTcpBinding com SecurityMode = TransportWithMessageCredential) em vez de um UPN/SPN. Se o serviço não estiver em execução com a identidade do computador ou a identidade DNS não for a identidade do computador, você deverá especificar manualmente o UPN/SPN correto no ponto de extremidade do cliente depois de importar o WSDL.
A identidade DNS é publicada no WSDL. Se SslStreamSecurityBindingElement for substituído no cliente, você deverá especificar um personalizado IdentityVerifier no do SslStreamSecurityBindingElementcliente.
O código a seguir mostra como especificar manualmente o UPN/SPN correto no ponto de extremidade do cliente, bem como especificar um personalizado IdentityVerifier no do SslStreamSecurityBindingElementcliente.
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();
}
}
Construtores
SslStreamSecurityBindingElement() |
Inicializa uma nova instância da classe SslStreamSecurityBindingElement. |
SslStreamSecurityBindingElement(SslStreamSecurityBindingElement) |
Inicializa uma nova instância da classe SslStreamSecurityBindingElement usando os valores de outro SslStreamSecurityBindingElement. |
Propriedades
IdentityVerifier |
Obtém ou define o verificador de identidade para esta associação. |
RequireClientCertificate |
Obtém ou define um valor que especifica se o certificado do cliente é necessário para esta associação. |
SslProtocols |
Especifica a lista de protocolos SSL/TLS a serem negociados ao usar um tipo de credencial do cliente TcpClientCredentialType.Certificate. O valor pode ser uma combinação de um ou mais dos seguintes membros de enumeração: Ssl3, Tls, Tls11 e Tls12. |
Métodos
BuildChannelFactory<TChannel>(BindingContext) |
Cria uma fábrica de canais de um tipo especificado. |
BuildChannelListener<TChannel>(BindingContext) |
Cria um ouvinte de canais de um tipo especificado. |
BuildChannelListener<TChannel>(BindingContext) |
Inicializa um ouvinte de canais para aceitar canais de um tipo especificado do contexto de associação. (Herdado de BindingElement) |
BuildClientStreamUpgradeProvider(BindingContext) |
Cria uma instância no cliente do StreamUpgradeProvider com base no contexto do canal fornecido. |
BuildServerStreamUpgradeProvider(BindingContext) |
Cria uma instância no servidor do StreamUpgradeProvider com base no contexto do canal fornecido. |
BuildServerStreamUpgradeProvider(BindingContext) |
Cria uma instância no servidor do StreamUpgradeProvider com base no contexto do canal fornecido. (Herdado de StreamUpgradeBindingElement) |
CanBuildChannelFactory<TChannel>(BindingContext) |
Obtém um valor que indica se uma fábrica de canais do tipo especificado pode ser criada. |
CanBuildChannelListener<TChannel>(BindingContext) |
Obtém um valor que indica se um ouvinte de canais do tipo especificado pode ser criado. |
CanBuildChannelListener<TChannel>(BindingContext) |
Retorna um valor que indica se o elemento de associação pode criar um ouvinte para um tipo de canal específico. (Herdado de BindingElement) |
Clone() |
Cria uma nova instância que é uma cópia da instância atual. |
Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object) |
GetHashCode() |
Serve como a função de hash padrão. (Herdado de Object) |
GetProperty<T>(BindingContext) |
Obtém um objeto especificado por meio do BindingContext. |
GetTransportTokenAssertion() |
Obtém o XmlElement que representa o token de transporte usado na associação de segurança. |
GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
MemberwiseClone() |
Cria uma cópia superficial do Object atual. (Herdado de Object) |
ShouldSerializeIdentityVerifier() |
Obtém um valor que indica se o verificador de identidade deve ser serializado. |
ToString() |
Retorna uma cadeia de caracteres que representa o objeto atual. (Herdado de Object) |
Implantações explícitas de interface
IPolicyExportExtension.ExportPolicy(MetadataExporter, PolicyConversionContext) |
Exporta uma asserção de política personalizada sobre associações. |