SslStreamSecurityBindingElement 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
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 및 명명된 파이프와 같은 스트림 지향 프로토콜을 사용하는 전송은 스트림 기반 전송 업그레이드를 지원합니다. 특히 WCF(Windows Communication Foundation)는 보안 업그레이드를 제공합니다. 이 전송 보안의 구성은 구성하여 사용자 지정 바인딩에 추가할 수 있는 SslStreamSecurityBindingElement 및 이 클래스에 의해 캡슐화됩니다. 또한 제3자가 사용자 지정 StreamSecurityBindingElement
를 직접 작성할 수 있습니다. 이러한 바인딩 요소는 클라이언트 및 서버 스트림 업그레이드 공급자를 빌드하기 위해 호출되는 StreamUpgradeBindingElement 클래스를 확장합니다.
사용자 지정 바인딩에는 특정 순서로 정렬된 바인딩 요소 컬렉션이 포함됩니다. 바인딩 스택의 최상위를 나타내는 요소가 가장 먼저 추가되고, 그 다음 요소가 두 번째로 추가되며 나머지 요소도 차례대로 추가됩니다.
바인딩에 이 클래스를 추가하려면
BindingElementCollection를 만듭니다.
선택적인 TransactionFlowBindingElement 및 ReliableSessionBindingElement처럼 바인딩 스택에서 이 바인딩 요소의 위에 오는 사용자 지정 바인딩 요소를 만듭니다.
BindingElementCollection 메서드를 사용하여 생성된 요소를 위에서 설명한 순서대로 InsertItem에 추가합니다.
SslStreamSecurityBindingElement의 인스턴스를 만들어 컬렉션에 추가합니다.
TcpTransportBindingElement와 같은 추가 사용자 지정 바인딩 요소를 컬렉션에 추가합니다.
WSDL을 가져온 후 클라이언트 엔드포인트에서 올바른 UPN/SPN을 수동으로 지정하거나 클라이언트의 SslStreamSecurityBindingElement에서 사용자 지정 IdentityVerifier 을 지정해야 하는 세 가지 시나리오가 있습니다.
WSDL에 게시된 서비스 ID가 없습니다. SspiNegotiatedOverTransport 및 HTTPS가 사용됩니다(예: SecurityMode = WSHttpBinding인 TransportWithMessageCredential). 서비스가 컴퓨터 ID를 사용하여 실행되고 있지 않은 경우 WSDL을 가져온 후 클라이언트 엔드포인트에서 수동으로 올바른 UPN/SPN을 지정해야 합니다.
DNS 서비스 ID는 WSDL에 게시됩니다. UPN/SPN 대신 SspiNegotiatedOverTransport 및 SslStreamSecurityBindingElement가 사용됩니다(예: SecurityMode = NetTcpBinding인 TransportWithMessageCredential). 서비스가 컴퓨터 ID를 사용하여 실행되고 있지 않거나 DNS ID가 컴퓨터 ID가 아닌 경우 WSDL을 가져온 후 클라이언트 엔드포인트에서 수동으로 올바른 UPN/SPN을 지정해야 합니다.
WSDL에 DNS ID가 게시되었습니다. 클라이언트에서 SslStreamSecurityBindingElement가 재정의되는 경우 클라이언트의 IdentityVerifier에서 사용자 지정 SslStreamSecurityBindingElement를 지정해야 합니다.
다음 코드에서는 클라이언트 엔드포인트에서 수동으로 올바른 UPN/SPN을 지정하는 방법과 클라이언트의 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) |
다른 SslStreamSecurityBindingElement의 값을 사용하여 SslStreamSecurityBindingElement 클래스의 새 인스턴스를 초기화합니다. |
속성
IdentityVerifier |
이 바인딩에 대한 ID 검증 도구를 가져오거나 설정합니다. |
RequireClientCertificate |
이 바인딩에 클라이언트 인증서가 필요한지 여부를 지정하는 값을 가져오거나 설정합니다. |
SslProtocols |
TcpClientCredentialType.Certificate의 클라이언트 자격 증명 형식을 사용하는 경우 협상할 SSL/TLS 프로토콜 목록을 지정합니다. 값은 열거형 멤버 Ssl3, Tls, Tls11, Tls12 중 하나 이상의 조합이 될 수 있습니다. |
메서드
명시적 인터페이스 구현
IPolicyExportExtension.ExportPolicy(MetadataExporter, PolicyConversionContext) |
바인딩에 대한 사용자 지정 정책 어설션을 내보냅니다. |
적용 대상
.NET