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 tramite un flusso SSL.
public ref class SslStreamSecurityBindingElement : System::ServiceModel::Channels::BindingElement
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, System.ServiceModel.Channels.ITransportTokenAssertionProvider, System.ServiceModel.Description.IPolicyExportExtension
type SslStreamSecurityBindingElement = class
inherit BindingElement
type SslStreamSecurityBindingElement = class
inherit StreamUpgradeBindingElement
interface ITransportTokenAssertionProvider
interface IPolicyExportExtension
Public Class SslStreamSecurityBindingElement
Inherits BindingElement
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 gli aggiornamenti del trasporto basati su flusso. In particolare, Windows Communication Foundation (WCF) fornisce aggiornamenti della sicurezza. La configurazione di questa sicurezza del trasporto è incapsulata da questa classe e da SslStreamSecurityBindingElement, che può essere configurata e aggiunta a un'associazione personalizzata. Inoltre, una terza parte può scrivere il proprio personalizzato StreamSecurityBindingElement. Questi elementi di associazione estendono la StreamUpgradeBindingElement classe chiamata per compilare i provider di aggiornamento del flusso client e server.
Un'associazione personalizzata contiene una raccolta di elementi di associazione disposti in un ordine specifico: l'elemento che rappresenta la parte superiore dello stack di binding viene aggiunto per primo, l'elemento successivo nello stack di binding viene aggiunto secondo e così via.
Per aggiungere questa classe a un'associazione
Creare un oggetto BindingElementCollection.
Creare elementi di associazione personalizzati sopra questo elemento di associazione nello stack di binding, ad esempio facoltativo TransactionFlowBindingElement e ReliableSessionBindingElement.
Aggiungere gli elementi creati nell'ordine descritto in precedenza all'oggetto BindingElementCollection utilizzando il InsertItem metodo .
Creare un'istanza di SslStreamSecurityBindingElement e aggiungerla alla raccolta.
Aggiungere altri elementi di associazione personalizzati alla raccolta, 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
Nessuna identità del servizio viene pubblicata in WSDL. SspiNegotiatedOverTransport e HTTPS vengono usati (ad esempio, con WSHttpBinding SecurityMode = TransportWithMessageCredential). Se il servizio non è in esecuzione con l'identità del computer, è necessario specificare manualmente l'UPN/SPN corretto nell'endpoint client dopo l'importazione del file WSDL.
L'identità del servizio DNS viene pubblicata in WSDL. SspiNegotiatedOverTransport e SslStreamSecurityBindingElement vengono usati (ad esempio, NetTcpBinding con SecurityMode = TransportWithMessageCredential) invece di un UPN/SPN. Se il servizio non è in esecuzione con l'identità del computer o l'identità DNS non è l'identità del computer, è necessario specificare manualmente l'UPN/SPN corretto nell'endpoint client dopo l'importazione di WSDL.
L'identità DNS viene pubblicata in WSDL. Se SslStreamSecurityBindingElement viene eseguito l'override nel client, è necessario specificare un oggetto personalizzato IdentityVerifier nel client.SslStreamSecurityBindingElement
Il codice seguente illustra come specificare manualmente l'UPN/SPN corretto nell'endpoint client, nonché come specificare un personalizzato IdentityVerifier nel client.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();
}
}
Costruttori
| Nome | Descrizione |
|---|---|
| SslStreamSecurityBindingElement() |
Inizializza una nuova istanza della classe SslStreamSecurityBindingElement. |
| SslStreamSecurityBindingElement(SslStreamSecurityBindingElement) |
Inizializza una nuova istanza della SslStreamSecurityBindingElement classe utilizzando i valori di un altro SslStreamSecurityBindingElementoggetto . |
Proprietà
| Nome | Descrizione |
|---|---|
| IdentityVerifier |
Ottiene o imposta il verificatore di identità per questa associazione. |
| RequireClientCertificate |
Ottiene o imposta un valore che specifica se per questa associazione è necessario un certificato client. |
| SslProtocols |
Specifica l'elenco dei protocolli SSL/TLS da negoziare quando si usa un tipo di credenziale client tcpClientCredentialType.Certificate. Il valore può essere una combinazione di uno degli altri membri di enumerazione seguenti: Ssl3, Tls, Tls11, Tls12. |
Metodi
| Nome | Descrizione |
|---|---|
| BuildChannelFactory<TChannel>(BindingContext) |
Crea una channel factory di un tipo specificato. |
| BuildChannelListener<TChannel>(BindingContext) |
Crea un listener di canale di un tipo specificato. |
| BuildClientStreamUpgradeProvider(BindingContext) |
Crea un'istanza nel client di in StreamUpgradeProvider base al contesto del canale fornito. |
| BuildServerStreamUpgradeProvider(BindingContext) |
Crea un'istanza nel server di StreamUpgradeProvider in base al contesto del canale fornito. |
| CanBuildChannelFactory<TChannel>(BindingContext) |
Ottiene un valore che indica se è possibile compilare una channel factory del tipo specificato. |
| CanBuildChannelListener<TChannel>(BindingContext) |
Ottiene un valore che indica se è possibile compilare un listener del canale del tipo specificato. |
| Clone() |
Crea una nuova istanza di che rappresenta 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 dall'oggetto BindingContext. |
| GetTransportTokenAssertion() |
Ottiene l'oggetto XmlElement che rappresenta il token di trasporto utilizzato nell'associazione di sicurezza. |
| GetType() |
Ottiene il Type dell'istanza corrente. (Ereditato da Object) |
| MemberwiseClone() |
Crea una copia superficiale del Objectcorrente. (Ereditato da Object) |
| ShouldSerializeIdentityVerifier() |
Ottiene un valore che indica se il verificatore di identificazione deve essere serializzato. |
| ToString() |
Restituisce una stringa che rappresenta l'oggetto corrente. (Ereditato da Object) |
Implementazioni dell'interfaccia esplicita
| Nome | Descrizione |
|---|---|
| IPolicyExportExtension.ExportPolicy(MetadataExporter, PolicyConversionContext) |
Esporta un'asserzione di criteri personalizzata sulle associazioni. |