SslStreamSecurityBindingElement Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Rappresenta un elemento di associazione personalizzato che supporta la sicurezza del canale mediante un flusso 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
- Ereditarietà
- Ereditarietà
- Implementazioni
Commenti
I trasporti che usano un protocollo orientato al flusso, ad esempio TCP e named pipe, supportano aggiornamenti del trasporto basati sul flusso. In particolare, Windows Communication Foundation (WCF) fornisce aggiornamenti della sicurezza. La configurazione della sicurezza a livello di trasporto viene incapsulata da questa classe e dalla classe SslStreamSecurityBindingElement, che possono essere configurate e aggiunte a un'associazione personalizzata. Inoltre, una terza parte può scrivere i propri StreamSecurityBindingElement
personalizzati. Questi elementi di associazione estendono la classe StreamUpgradeBindingElement che viene chiamata per compilare i provider di aggiornamento flusso client e server.
Un'associazione personalizzata contiene una raccolta di elementi di associazione disposti in un ordine specifico: l'elemento che rappresenta l'inizio dello stack dell'associazione viene aggiunto per primo, l'elemento immediatamente successivo viene aggiunto per secondo e così via.
Per aggiungere questa classe a un'associazione
Creare un oggetto BindingElementCollection.
Creare elementi di associazione personalizzati che si trovino prima di questo elemento di associazione nello stack dell'associazione, ad esempio gli elementi facoltativi TransactionFlowBindingElement e ReliableSessionBindingElement.
Aggiungere gli elementi creati, nell'ordine descritto in precedenza, all'oggetto BindingElementCollection utilizzando il metodo InsertItem.
Creare un'istanza di SslStreamSecurityBindingElement e aggiungerla alla raccolta.
Aggiungere alla raccolta qualsiasi elemento di associazione personalizzato aggiuntivo, ad esempio TcpTransportBindingElement.
Esistono tre scenari in cui è necessario specificare manualmente l'UPN/SPN corretto nell'endpoint client dopo l'importazione di WSDL oppure specificare un personalizzato IdentityVerifier nel client.SslStreamSecurityBindingElement
Non viene pubblicata nessuna identità del servizio in WSDL. Vengono utilizzati SspiNegotiatedOverTransport e Https (ad esempio, un oggetto WSHttpBinding con SecurityMode = TransportWithMessageCredential). Se il servizio non è in esecuzione con l'identità del computer, è necessario specificare manualmente l'UPN/SPN corretto sull'endpoint client dopo avere importato WSDL.
L'identità del servizio DNS viene pubblicata in WSDL. SspiNegotiatedOverTransport e SslStreamSecurityBindingElement vengono usati (ad esempio, NetTcpBinding con SecurityMode = TransportWithMessageCredential) anziché un UPN/SPN. Se il servizio non è in esecuzione con l'identità del computer o l'identità DNS non è quella del computer, è necessario specificare manualmente l'UPN/SPN corretto sull'endpoint client dopo avere importato WSDL.
L'identità DNS viene pubblicata in WSDL. Se SslStreamSecurityBindingElement viene ignorato sul client, è necessario specificare un oggetto IdentityVerifier personalizzato su SslStreamSecurityBindingElement del client.
Nel codice seguente viene mostrato come specificare manualmente l'UPN/SPN corretto sull'endpoint client, così come specificare un oggetto IdentityVerifier personalizzato su SslStreamSecurityBindingElement del client.
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();
}
}
Costruttori
SslStreamSecurityBindingElement() |
Inizializza una nuova istanza della classe SslStreamSecurityBindingElement. |
SslStreamSecurityBindingElement(SslStreamSecurityBindingElement) |
Inizializza una nuova istanza della classe SslStreamSecurityBindingElement usando i valori relativi a un'altra classe SslStreamSecurityBindingElement. |
Proprietà
IdentityVerifier |
Ottiene o imposta il verificatore di identità per questo binding. |
RequireClientCertificate |
Ottiene o imposta un valore che specifica se un certificato client è obbligatorio per questa associazione. |
SslProtocols |
Specifica l'elenco dei protocolli SSL/TLS per negoziare quando si usa un tipo di credenziale client di TcpClientCredentialType.Certificate. Il valore può essere una combinazione di uno o più dei seguenti membri dell'enumerazione: Ssl3, Tls, Tls11, Tls12. |
Metodi
BuildChannelFactory<TChannel>(BindingContext) |
Crea una channel factory di un tipo specificato. |
BuildChannelListener<TChannel>(BindingContext) |
Crea un listener del canale di un tipo specificato. |
BuildChannelListener<TChannel>(BindingContext) |
Inizializza un listener del canale per accettare canali di un tipo specificato dal contesto dell'associazione. (Ereditato da BindingElement) |
BuildClientStreamUpgradeProvider(BindingContext) |
Crea un'istanza nel client di StreamUpgradeProvider basata sul contesto del canale fornito. |
BuildServerStreamUpgradeProvider(BindingContext) |
Crea un'istanza nel server di StreamUpgradeProvider basata sul contesto del canale fornito. |
BuildServerStreamUpgradeProvider(BindingContext) |
Crea un'istanza nel server di StreamUpgradeProvider basata sul contesto del canale fornito. (Ereditato da StreamUpgradeBindingElement) |
CanBuildChannelFactory<TChannel>(BindingContext) |
Ottiene un valore che indica se può essere compilata una channel factory del tipo specificato. |
CanBuildChannelListener<TChannel>(BindingContext) |
Ottiene un valore che indica se può essere compilato un listener del canale del tipo specificato. |
CanBuildChannelListener<TChannel>(BindingContext) |
Restituisce un valore che indica se l'elemento di associazione può compilare un listener per un tipo di canale specifico. (Ereditato da BindingElement) |
Clone() |
Crea una nuova istanza che è una copia dell'istanza corrente. |
Equals(Object) |
Determina se l'oggetto specificato è uguale all'oggetto corrente. (Ereditato da Object) |
GetHashCode() |
Funge da funzione hash predefinita. (Ereditato da Object) |
GetProperty<T>(BindingContext) |
Ottiene un oggetto specificato da BindingContext. |
GetTransportTokenAssertion() |
Ottiene il XmlElement che rappresenta il token di trasporto utilizzato nell'associazione di sicurezza. |
GetType() |
Ottiene l'oggetto Type dell'istanza corrente. (Ereditato da Object) |
MemberwiseClone() |
Crea una copia superficiale dell'oggetto Object corrente. (Ereditato da Object) |
ShouldSerializeIdentityVerifier() |
Ottiene un valore che indica se è necessario serializzare il sistema di verifica di identità. |
ToString() |
Restituisce una stringa che rappresenta l'oggetto corrente. (Ereditato da Object) |
Implementazioni dell'interfaccia esplicita
IPolicyExportExtension.ExportPolicy(MetadataExporter, PolicyConversionContext) |
Esporta un'asserzione di criteri personalizzata relativa ad associazioni. |