SslStreamSecurityBindingElement Kelas

Definisi

Mewakili elemen pengikatan khusus yang mendukung keamanan saluran menggunakan aliran 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
Warisan
SslStreamSecurityBindingElement
Warisan
SslStreamSecurityBindingElement
Penerapan

Keterangan

Transportasi yang menggunakan protokol berorientasi aliran seperti TCP dan pipa yang dinamai mendukung peningkatan transportasi berbasis stream. Secara khusus, Windows Communication Foundation (WCF) menyediakan peningkatan keamanan. Konfigurasi keamanan transportasi ini dienkapsulasi oleh kelas ini serta oleh SslStreamSecurityBindingElement, yang dapat dikonfigurasi dan ditambahkan ke pengikatan kustom. Selain itu, pihak ketiga dapat menulis kustom StreamSecurityBindingElementmereka sendiri. Elemen pengikatan ini memperluas StreamUpgradeBindingElement kelas yang dipanggil untuk membangun penyedia peningkatan aliran klien dan server.

Pengikatan kustom berisi kumpulan elemen pengikatan yang disusun dalam urutan tertentu: elemen yang mewakili bagian atas tumpukan pengikatan ditambahkan terlebih dahulu, elemen berikutnya ke bawah dalam tumpukan pengikatan ditambahkan kedua, dan seterusnya.

Untuk menambahkan kelas ini ke pengikatan

  1. Buat BindingElementCollection.

  2. Buat elemen pengikatan kustom yang berada di atas elemen pengikatan ini di tumpukan pengikatan, seperti opsional TransactionFlowBindingElement dan ReliableSessionBindingElement.

  3. Tambahkan elemen yang dibuat dalam urutan yang dijelaskan sebelumnya ke BindingElementCollection menggunakan InsertItem metode .

  4. Buat instans SslStreamSecurityBindingElement dan tambahkan ke koleksi.

  5. Tambahkan elemen pengikatan kustom tambahan ke koleksi, seperti TcpTransportBindingElement.

Ada tiga skenario di mana Anda harus menentukan UPN/SPN yang benar secara manual pada titik akhir klien setelah mengimpor WSDL, atau menentukan kustom IdentityVerifier pada klien SslStreamSecurityBindingElement.

  1. Tidak ada identitas layanan yang diterbitkan di WSDL. SspiNegotiatedOverTransport dan HTTPS digunakan (misalnya, WSHttpBinding dengan SecurityMode = TransportWithMessageCredential). Jika layanan tidak berjalan dengan identitas komputer, Anda harus menentukan UPN/SPN yang benar secara manual pada titik akhir klien setelah mengimpor WSDL.

  2. Identitas layanan DNS diterbitkan di WSDL. SspiNegotiatedOverTransport dan SslStreamSecurityBindingElement digunakan (misalnya, NetTcpBinding dengan SecurityMode = TransportWithMessageCredential) alih-alih UPN/SPN. Jika layanan tidak berjalan dengan identitas komputer, atau identitas DNS bukan identitas komputer, Anda harus menentukan UPN/SPN yang benar secara manual pada titik akhir klien setelah mengimpor WSDL.

  3. Identitas DNS diterbitkan di WSDL. Jika SslStreamSecurityBindingElement ditimpa pada klien, Anda harus menentukan kustom IdentityVerifier pada klien SslStreamSecurityBindingElement.

Kode berikut menunjukkan cara menentukan UPN/SPN yang benar secara manual pada titik akhir klien, serta cara menentukan kustom IdentityVerifier pada klien 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();  
        }  
    }  

Konstruktor

SslStreamSecurityBindingElement()

Menginisialisasi instans baru kelas SslStreamSecurityBindingElement.

SslStreamSecurityBindingElement(SslStreamSecurityBindingElement)

Menginisialisasi instans SslStreamSecurityBindingElement baru kelas menggunakan nilai dari yang lain SslStreamSecurityBindingElement.

Properti

IdentityVerifier

Mendapatkan atau mengatur pemverifikasi identitas untuk pengikatan ini.

RequireClientCertificate

Mendapatkan atau menetapkan nilai yang menentukan apakah sertifikat klien diperlukan untuk pengikatan ini.

SslProtocols

Menentukan daftar protokol SSL/TLS untuk dinegosiasikan saat menggunakan jenis kredensial klien TcpClientCredentialType.Certificate. Nilainya bisa menjadi kombinasi dari salah satu dari lebih dari anggota enumerasi berikut: Ssl3, Tls, Tls11, Tls12.

Metode

BuildChannelFactory<TChannel>(BindingContext)

Membuat pabrik saluran dengan jenis tertentu.

BuildChannelListener<TChannel>(BindingContext)

Membuat pendengar saluran dari jenis tertentu.

BuildChannelListener<TChannel>(BindingContext)

Menginisialisasi pendengar saluran untuk menerima saluran dari jenis tertentu dari konteks pengikatan.

(Diperoleh dari BindingElement)
BuildClientStreamUpgradeProvider(BindingContext)

Membuat instans pada klien StreamUpgradeProvider berdasarkan konteks saluran yang disediakan.

BuildServerStreamUpgradeProvider(BindingContext)

Membuat instans di server StreamUpgradeProvider berdasarkan konteks saluran yang disediakan.

BuildServerStreamUpgradeProvider(BindingContext)

Membuat instans di server StreamUpgradeProvider berdasarkan konteks saluran yang disediakan.

(Diperoleh dari StreamUpgradeBindingElement)
CanBuildChannelFactory<TChannel>(BindingContext)

Mendapatkan nilai yang menunjukkan apakah pabrik saluran dari jenis yang ditentukan dapat dibangun.

CanBuildChannelListener<TChannel>(BindingContext)

Mendapatkan nilai yang menunjukkan apakah pendengar saluran dari jenis yang ditentukan dapat dibangun.

CanBuildChannelListener<TChannel>(BindingContext)

Mengembalikan nilai yang menunjukkan apakah elemen pengikatan dapat membangun pendengar untuk jenis saluran tertentu.

(Diperoleh dari BindingElement)
Clone()

Membuat instans baru yang merupakan salinan instans saat ini.

Equals(Object)

Menentukan apakah objek yang ditentukan sama dengan objek saat ini.

(Diperoleh dari Object)
GetHashCode()

Berfungsi sebagai fungsi hash default.

(Diperoleh dari Object)
GetProperty<T>(BindingContext)

Mendapatkan objek tertentu dari BindingContext.

GetTransportTokenAssertion()

XmlElement Mendapatkan yang mewakili token transportasi yang digunakan dalam pengikatan keamanan.

GetType()

Mendapatkan dari instans Type saat ini.

(Diperoleh dari Object)
MemberwiseClone()

Membuat salinan dangkal dari saat ini Object.

(Diperoleh dari Object)
ShouldSerializeIdentityVerifier()

Mendapatkan nilai yang menunjukkan apakah pemverifikasi identifikasi harus diserialisasikan.

ToString()

Mengembalikan string yang mewakili objek saat ini.

(Diperoleh dari Object)

Implementasi Antarmuka Eksplisit

IPolicyExportExtension.ExportPolicy(MetadataExporter, PolicyConversionContext)

Mengekspor pernyataan kebijakan kustom tentang pengikatan.

Berlaku untuk