다음을 통해 공유


연습: 사용자 지정 클라이언트 및 서비스 자격 증명 만들기

이 항목에서는 사용자 지정 클라이언트와 서비스 자격 증명을 구현하는 방법 및 애플리케이션 코드로부터 사용자 지정 자격 증명을 사용하는 방법을 보여 줍니다.

자격 증명 확장성 클래스

ClientCredentialsServiceCredentials 클래스는 WCF(Windows Communication Foundation) 보안 확장성의 기본 진입점입니다. 이러한 자격 증명 클래스는 API를 제공합니다. 이 API를 통해 애플리케이션 코드에서는 자격 증명 정보를 설정하고, 자격 증명 형식을 보안 토큰으로 변환할 수 있습니다. (보안 토큰은 SOAP 메시지 내에서 자격 정보를 전송하는 데 사용되는 형식입니다.) 이러한 자격 증명 클래스의 책임은 두 가지 영역으로 나눌 수 있습니다.

  • 애플리케이션에서 자격 증명 정보를 설정하도록 API 제공

  • SecurityTokenManager 구현을 위한 팩터리 역할 수행

WCF에서 제공되는 기본 구현은 시스템 제공 자격 증명 형식을 지원하고, 이러한 자격 증명 형식을 처리할 수 있는 보안 토큰 관리자를 만듭니다.

사용자 지정해야 하는 이유

클라이언트 또는 서비스 자격 증명 클래스를 사용자 지정해야 하는 이유는 여러 가지가 있습니다. 가장 먼저 시스템 제공 자격 증명 형식의 처리와 관련하여 기본 WCF 보안 동작을 변경해야 하며, 주요 이유는 다음과 같습니다.

  • 다른 확장성 지점을 사용하여 변경할 수 없는 내용을 변경해야 합니다.

  • 새 자격 증명 형식을 추가해야 합니다.

  • 새 사용자 지정 보안 토큰 형식을 추가해야 합니다.

이 항목에서는 사용자 지정 클라이언트와 서비스 자격 증명을 구현하는 방법 및 애플리케이션 코드로부터 이들을 사용하는 방법에 대해 설명합니다.

시리즈의 첫 번째 단계

사용자 지정 자격 증명 클래스를 만드는 것은 첫 번째 단계일 뿐입니다. 자격 증명을 사용자 지정하는 것은 자격 증명 프로비저닝, 보안 토큰 직렬화 또는 인증과 관련된 WCF 동작 변경으로 이어지기 때문입니다. 이 단원의 다른 항목에서는 사용자 지정 serializer 및 인증자를 만드는 방법에 대해 설명합니다. 이와 관련하여 사용자 지정 자격 증명 클래스를 만드는 것이 이 시리즈의 첫 번째 항목입니다. 후속 작업(사용자 지정 serializer 및 인증자 만들기)은 사용자 지정 자격 증명을 만든 이후에야 수행할 수 있습니다. 이 항목을 기초로 한 추가 항목은 다음과 같습니다.

절차

사용자 지정 클라이언트 자격 증명을 구현하려면

  1. ClientCredentials 클래스에서 파생된 새 클래스를 정의합니다.

  2. 선택 사항. 새 자격 증명 형식에 대해 새 메서드 또는 속성을 추가합니다. 새 자격 증명 형식을 추가하지 않으려면 이 단계를 건너뜁니다. 다음 예제에서는 CreditCardNumber 속성을 추가합니다.

  3. CreateSecurityTokenManager 메서드를 재정의합니다. 이 메서드는 사용자 지정 클라이언트 자격 증명을 사용할 때 WCF 보안 인프라에서 자동으로 호출합니다. 이 메서드는 SecurityTokenManager 클래스 구현의 인스턴스를 만들고 반환합니다.

    Important

    CreateSecurityTokenManager 메서드가 사용자 지정 보안 토큰 관리자를 만들기 위해 재정의된다는 점에 유의해야 합니다. ClientCredentialsSecurityTokenManager에서 파생된 보안 토큰 관리자는 SecurityTokenProvider에서 파생된 사용자 지정 보안 토큰 공급자를 반환하여 실제 보안 토큰을 만들어야 합니다. 보안 토큰을 만들 때 이 방식을 따르지 않으면 ChannelFactory 개체를 캐시할 때(WCF 클라이언트 프록시의 기본 동작임) 애플리케이션의 기능이 제대로 수행되지 않아 권한 상승 공격이 발생할 수 있습니다. 사용자 지정 자격 증명 개체는 ChannelFactory의 일부분으로 캐시됩니다. 그러나 사용자 지정 SecurityTokenManager는 호출할 때마다 만들어지므로 토큰 생성 논리가 SecurityTokenManager에 있는 한 보안 위협은 완화됩니다.

  4. CloneCore 메서드를 재정의합니다.

    public class MyClientCredentials : ClientCredentials
    {
        string creditCardNumber;
    
        public MyClientCredentials()
        {
            // Perform client credentials initialization.
        }
    
        protected MyClientCredentials(MyClientCredentials other)
            : base(other)
        {
            // Clone fields defined in this class.
            this.creditCardNumber = other.creditCardNumber;
        }
    
        public string CreditCardNumber
        {
            get
            {
                return this.creditCardNumber;
            }
            set
            {
                if (value == null)
                {
                    throw new ArgumentNullException("value");
                }
                this.creditCardNumber = value;
            }
        }
    
        public override SecurityTokenManager CreateSecurityTokenManager()
        {
            // Return your implementation of the SecurityTokenManager.
            return new MyClientCredentialsSecurityTokenManager(this);
        }
    
        protected override ClientCredentials CloneCore()
        {
            // Implement the cloning functionality.
            return new MyClientCredentials(this);
        }
    }
    
    Public Class MyClientCredentials
        Inherits ClientCredentials
        Private creditCardNumberValue As String
    
        Public Sub New()
    
        End Sub
    
        ' Perform client credentials initialization.    
        Protected Sub New(ByVal other As MyClientCredentials)
            MyBase.New(other)
            ' Clone fields defined in this class.
            Me.creditCardNumberValue = other.creditCardNumberValue
    
        End Sub
    
        Public Property CreditCardNumber() As String
            Get
                Return Me.creditCardNumberValue
            End Get
            Set
                If value Is Nothing Then
                    Throw New ArgumentNullException("value")
                End If
                Me.creditCardNumberValue = value
            End Set
        End Property
    
        Public Overrides Function CreateSecurityTokenManager() As SecurityTokenManager
            ' Return your implementation of the SecurityTokenManager.
            Return New MyClientCredentialsSecurityTokenManager(Me)
    
        End Function
    
        Protected Overrides Function CloneCore() As ClientCredentials
            ' Implement the cloning functionality.
            Return New MyClientCredentials(Me)
    
        End Function
    End Class
    

사용자 지정 클라이언트 보안 토큰 관리자를 구현하려면

  1. ClientCredentialsSecurityTokenManager에서 파생된 새 클래스를 정의합니다.

  2. 선택 사항. 사용자 지정 CreateSecurityTokenProvider(SecurityTokenRequirement) 구현을 만들어야 하는 경우 SecurityTokenProvider 메서드를 재정의합니다. 사용자 지정 보안 토큰 공급자에 대한 자세한 내용은 방법: 사용자 지정 보안 토큰 공급자 만들기를 참조하세요.

  3. 선택 사항. 사용자 지정 CreateSecurityTokenAuthenticator(SecurityTokenRequirement, SecurityTokenResolver) 구현을 만들어야 하는 경우 SecurityTokenAuthenticator 메서드를 재정의합니다. 사용자 지정 보안 토큰 인증자에 대한 자세한 내용은 방법: 사용자 지정 보안 토큰 인증자 만들기를 참조하세요.

  4. 선택 사항. 사용자 지정 CreateSecurityTokenSerializer를 만들어야 하는 경우 SecurityTokenSerializer 메서드를 재정의합니다. 사용자 지정 보안 토큰 및 사용자 지정 보안 토큰 직렬 변환기에 대한 자세한 내용은 방법: 사용자 지정 토큰 만들기를 참조하세요.

    internal class MyClientCredentialsSecurityTokenManager :
        ClientCredentialsSecurityTokenManager
    {
        MyClientCredentials credentials;
    
        public MyClientCredentialsSecurityTokenManager(MyClientCredentials credentials)
            : base(credentials)
        {
            this.credentials = credentials;
        }
    
        public override SecurityTokenProvider CreateSecurityTokenProvider(
            SecurityTokenRequirement tokenRequirement)
        {
            // Return your implementation of the SecurityTokenProvider, if required.
            // This implementation delegates to the base class.
            return base.CreateSecurityTokenProvider(tokenRequirement);
        }
    
        public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(
            SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver)
        {
            // Return your implementation of the SecurityTokenAuthenticator, if required.
            // This implementation delegates to the base class.
            return base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver);
        }
    
        public override SecurityTokenSerializer CreateSecurityTokenSerializer(SecurityTokenVersion version)
        {
            // Return your implementation of the SecurityTokenSerializer, if required.
            // This implementation delegates to the base class.
            return base.CreateSecurityTokenSerializer(version);
        }
    }
    
    
    Friend Class MyClientCredentialsSecurityTokenManager
        Inherits ClientCredentialsSecurityTokenManager
        Private credentials As MyClientCredentials
    
    
        Public Sub New(ByVal credentials As MyClientCredentials)
            MyBase.New(credentials)
            Me.credentials = credentials
    
        End Sub
    
    
        Public Overrides Function CreateSecurityTokenProvider( _
        ByVal tokenRequirement As SecurityTokenRequirement) As SecurityTokenProvider
            ' Return your implementation of the SecurityTokenProvider, if required.
            ' This implementation delegates to the base class.
            Return MyBase.CreateSecurityTokenProvider(tokenRequirement)
    
        End Function
    
    
        Public Overrides Function CreateSecurityTokenAuthenticator( _
        ByVal tokenRequirement As SecurityTokenRequirement, _
        ByRef outOfBandTokenResolver As SecurityTokenResolver) As SecurityTokenAuthenticator
            ' Return your implementation of the SecurityTokenAuthenticator, if required.
            ' This implementation delegates to the base class.
            Return MyBase.CreateSecurityTokenAuthenticator(tokenRequirement, outOfBandTokenResolver)
    
        End Function
    
    
        Public Overrides Function CreateSecurityTokenSerializer(ByVal version As SecurityTokenVersion) _
        As SecurityTokenSerializer
            ' Return your implementation of the SecurityTokenSerializer, if required.
            ' This implementation delegates to the base class.
            Return MyBase.CreateSecurityTokenSerializer(version)
    
        End Function
    End Class
    

애플리케이션 코드로부터 사용자 지정 클라이언트 자격 증명을 사용하려면

  1. 서비스 인터페이스를 나타내는 생성된 클라이언트의 인스턴스를 만들거나 사용자가 통신하려고 하는 서비스를 가리키는 ChannelFactory의 인스턴스를 만듭니다.

  2. Behaviors 속성을 통해 액세스할 수 있는 Endpoint 컬렉션으로부터 시스템 제공 클라이언트 자격 증명 동작을 제거합니다.

  3. 사용자 지정 클라이언트 자격 증명 클래스의 새 인스턴스를 만들고 이 인스턴스를 Behaviors 속성을 통해 액세스할 수 있는 Endpoint 컬렉션에 추가합니다.

    // Create a client with the client endpoint configuration.
    CalculatorClient client = new CalculatorClient();
    
    // Remove the ClientCredentials behavior.
    client.ChannelFactory.Endpoint.Behaviors.Remove<ClientCredentials>();
    
    // Add a custom client credentials instance to the behaviors collection.
    client.ChannelFactory.Endpoint.Behaviors.Add(new MyClientCredentials());
    
    ' Create a client with the client endpoint configuration.
    Dim client As New CalculatorClient()
    
    ' Remove the ClientCredentials behavior.
    client.ChannelFactory.Endpoint.Behaviors.Remove(Of ClientCredentials)()
    
    ' Add a custom client credentials instance to the behaviors collection.
    client.ChannelFactory.Endpoint.Behaviors.Add(New MyClientCredentials())
    

이전 절차는 애플리케이션 코드에서 클라이언트 자격 증명을 사용하는 방법을 보여 줍니다. WCF 자격 증명은 애플리케이션 구성 파일을 사용하여 구성할 수도 있습니다. 소스를 수정하고, 다시 컴파일하고, 다시 배포하지 않고도 애플리케이션 매개 변수를 수정할 수 있기 때문에 종종 애플리케이션 구성을 사용하는 것이 하드 코딩보다 좋습니다.

다음 절차에서는 사용자 지정 자격 증명을 구성하기 위해 지원을 제공하는 방법에 대해 설명합니다.

사용자 지정 클라이언트 자격 증명에 대한 구성 처리기 만들기

  1. ClientCredentialsElement에서 파생된 새 클래스를 정의합니다.

  2. 선택 사항. 애플리케이션 구성을 통해 노출하려고 하는 모든 추가 구성 매개 변수에 대한 속성을 추가합니다. 아래 예제에서는 이름이 CreditCardNumber인 속성 하나를 추가합니다.

  3. 구성 요소를 사용하여 만들어진 사용자 지정 클라이언트 자격 증명 클래스의 형식을 반환하려면 BehaviorType 속성을 재정의합니다.

  4. CreateBehavior 메서드를 재정의합니다. 이 메서드는 구성 파일로부터 로드된 설정을 기반으로 사용자 지정 자격 증명 클래스의 인스턴스를 만들고 반환합니다. 사용자 지정 클라이언트 자격 증명 인스턴스로 로드된 시스템 제공 자격 증명 설정을 검색하려면 이 메서드로부터 기본 ApplyConfiguration(ClientCredentials) 메서드를 호출합니다.

  5. 선택 사항. 2단계에서 속성을 추가한 경우 구성 프레임워크에 대한 추가 구성 설정을 등록하여 이를 인식할 수 있도록 하려면 Properties 속성을 재정의해야 합니다. 사용자의 속성과 기본 클래스 속성을 조합하면 이 사용자 지정 클라이언트 자격 증명 구성 요소를 통해 시스템 제공 설정을 구성할 수 있습니다.

    public class MyClientCredentialsConfigHandler : ClientCredentialsElement
    {
        ConfigurationPropertyCollection properties;
    
        public override Type BehaviorType
        {
            get { return typeof(MyClientCredentials); }
        }
    
        public string CreditCardNumber
        {
            get { return (string)base["creditCardNumber"]; }
            set
            {
                if (String.IsNullOrEmpty(value))
                {
                    value = String.Empty;
                }
                base["creditCardNumber"] = value;
            }
        }
    
        protected override ConfigurationPropertyCollection Properties
        {
            get
            {
                if (this.properties == null)
                {
                    ConfigurationPropertyCollection properties = base.Properties;
                    properties.Add(new ConfigurationProperty(
                        "creditCardNumber",
                        typeof(System.String),
                        string.Empty,
                        null,
                        new StringValidator(0, 32, null),
                        ConfigurationPropertyOptions.None));
                    this.properties = properties;
                }
                return this.properties;
            }
        }
    
        protected override object CreateBehavior()
        {
            MyClientCredentials creds = new MyClientCredentials();
            creds.CreditCardNumber = CreditCardNumber;
            base.ApplyConfiguration(creds);
            return creds;
        }
    }
    
    
    Public Class MyClientCredentialsConfigHandler
        Inherits ClientCredentialsElement
        Private propertiesValue As ConfigurationPropertyCollection
    
    
        Public Overrides ReadOnly Property BehaviorType() As Type
            Get
                Return GetType(MyClientCredentials)
            End Get
        End Property
    
        Public Property CreditCardNumber() As String
            Get
                Return CStr(MyBase.Item("creditCardNumber"))
            End Get
            Set
                If String.IsNullOrEmpty(value) Then
                    value = String.Empty
                End If
                MyBase.Item("creditCardNumber") = value
            End Set
        End Property
    
    
        Protected Overrides ReadOnly Property Properties() As ConfigurationPropertyCollection
            Get
                If Me.propertiesValue Is Nothing Then
                    Dim myProperties As ConfigurationPropertyCollection = MyBase.Properties
                    myProperties.Add(New ConfigurationProperty( _
                    "creditCardNumber", _
                    GetType(System.String), _
                    String.Empty, _
                    Nothing, _
                    New StringValidator(0, 32, Nothing), _
                    ConfigurationPropertyOptions.None))
                    Me.propertiesValue = myProperties
                End If
                Return Me.propertiesValue
            End Get
        End Property
    
    
        Protected Overrides Function CreateBehavior() As Object
            Dim creds As New MyClientCredentials()
            creds.CreditCardNumber = Me.CreditCardNumber
            MyBase.ApplyConfiguration(creds)
            Return creds
    
        End Function
    End Class
    

구성 처리기 클래스가 있으면 WCF 구성 프레임워크에 통합할 수 있습니다. 이를 통해 다음 절차에서처럼 사용자 지정 클라이언트 자격 증명을 클라이언트 엔드포인트 동작 요소에서 사용할 수 있습니다.

애플리케이션 구성에서 사용자 지정 클라이언트 자격 증명 구성 처리기를 등록 및 사용하려면

  1. 구성 파일에 <extensions> 요소와 <behaviorExtensions> 요소를 추가합니다.

  2. <add> 요소를 <behaviorExtensions> 요소에 추가하고 name 특성을 적절한 값으로 설정합니다.

  3. type 특성을 정규화된 형식 이름으로 설정합니다. 또한 어셈블리 이름과 기타 어셈블리 특성을 포함시킵니다.

    <system.serviceModel>
      <extensions>
        <behaviorExtensions>
          <add name="myClientCredentials" type="Microsoft.ServiceModel.Samples.MyClientCredentialsConfigHandler, CustomCredentials, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        </behaviorExtensions>
      </extensions>
    </system.serviceModel>
    
  4. 구성 처리기를 등록한 후 사용자 지정 자격 증명 요소는 시스템 제공 <clientCredentials> 요소 대신 동일한 구성 파일 내에서 사용할 수 있습니다. 시스템 제공 속성 및 구성 처리기 구현에 추가한 새 속성을 모두 사용할 수 있습니다. 다음 예제에서는 creditCardNumber 특성을 사용하여 사용자 지정 속성의 값을 설정합니다.

    <behaviors>
      <endpointBehaviors>
        <behavior name="myClientCredentialsBehavior">
          <myClientCredentials creditCardNumber="123-123-123"/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    

사용자 지정 서비스 자격 증명을 구현하려면

  1. ServiceCredentials에서 파생된 새 클래스를 정의합니다.

  2. 선택 사항. 추가 중인 새 자격 증명 값에 대한 API를 제공하려면 새 속성을 추가합니다. 새 자격 증명 값을 추가하지 않으려면 이 단계를 건너뜁니다. 다음 예제에서는 AdditionalCertificate 속성을 추가합니다.

  3. CreateSecurityTokenManager 메서드를 재정의합니다. 이 메서드는 사용자 지정 클라이언트 자격 증명이 사용될 때 WCF 인프라에서 자동으로 호출됩니다. 이 메서드는 SecurityTokenManager 클래스 구현의 인스턴스를 만들고 반환하며, 이에 대해서는 다음 절차에서 설명합니다.

  4. 선택 사항. CloneCore 메서드를 재정의합니다. 이는 새 속성 또는 내부 필드를 사용자 지정 클라이언트 자격 증명 구현에 추가하는 경우에만 필요합니다.

    public class MyServiceCredentials : ServiceCredentials
    {
        X509Certificate2 additionalCertificate;
    
        public MyServiceCredentials()
        {
        }
    
        protected MyServiceCredentials(MyServiceCredentials other)
            : base(other)
        {
            this.additionalCertificate = other.additionalCertificate;
        }
    
        public X509Certificate2 AdditionalCertificate
        {
            get
            {
                return this.additionalCertificate;
            }
            set
            {
                if (value == null)
                {
                    throw new ArgumentNullException("value");
                }
                this.additionalCertificate = value;
            }
        }
    
        public override SecurityTokenManager CreateSecurityTokenManager()
        {
            return base.CreateSecurityTokenManager();
        }
    
        protected override ServiceCredentials CloneCore()
        {
            return new MyServiceCredentials(this);
        }
    }
    
    Public Class MyServiceCredentials
        Inherits ServiceCredentials
        Private additionalCertificateValue As X509Certificate2
    
        Public Sub New()
    
        End Sub
    
        Protected Sub New(ByVal other As MyServiceCredentials)
            MyBase.New(other)
            Me.additionalCertificate = other.additionalCertificate
        End Sub
    
    
        Public Property AdditionalCertificate() As X509Certificate2
            Get
                Return Me.additionalCertificateValue
            End Get
            Set
                If value Is Nothing Then
                    Throw New ArgumentNullException("value")
                End If
                Me.additionalCertificateValue = value
            End Set
        End Property
    
        Public Overrides Function CreateSecurityTokenManager() As SecurityTokenManager
            Return MyBase.CreateSecurityTokenManager()
    
        End Function
    
    
        Protected Overrides Function CloneCore() As ServiceCredentials
            Return New MyServiceCredentials(Me)
    
        End Function
    End Class
    

사용자 지정 서비스 보안 토큰 관리자를 구현하려면

  1. ServiceCredentialsSecurityTokenManager 클래스에서 파생된 새 클래스를 정의합니다.

  2. 선택 사항. 사용자 지정 CreateSecurityTokenProvider 구현을 만들어야 하는 경우 SecurityTokenProvider 메서드를 재정의합니다. 사용자 지정 보안 토큰 공급자에 대한 자세한 내용은 방법: 사용자 지정 보안 토큰 공급자 만들기를 참조하세요.

  3. 선택 사항. 사용자 지정 CreateSecurityTokenAuthenticator 구현을 만들어야 하는 경우 SecurityTokenAuthenticator 메서드를 재정의합니다. 사용자 지정 보안 토큰 인증자에 대한 자세한 내용은 방법: 사용자 지정 보안 토큰 인증자 만들기 항목을 참조하세요.

  4. 선택 사항. 사용자 지정 CreateSecurityTokenSerializer(SecurityTokenVersion)를 만들어야 하는 경우 SecurityTokenSerializer 메서드를 재정의합니다. 사용자 지정 보안 토큰 및 사용자 지정 보안 토큰 직렬 변환기에 대한 자세한 내용은 방법: 사용자 지정 토큰 만들기를 참조하세요.

    internal class MyServiceCredentialsSecurityTokenManager :
        ServiceCredentialsSecurityTokenManager
    {
        MyServiceCredentials credentials;
    
        public MyServiceCredentialsSecurityTokenManager(MyServiceCredentials credentials)
            : base(credentials)
        {
            this.credentials = credentials;
        }
    
        public override SecurityTokenProvider CreateSecurityTokenProvider(SecurityTokenRequirement tokenRequirement)
        {
            // Return your implementation of SecurityTokenProvider, if required.
            // This implementation delegates to the base class.
            return base.CreateSecurityTokenProvider(tokenRequirement);
        }
    
        public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver)
        {
            // Return your implementation of SecurityTokenProvider, if required.
            // This implementation delegates to the base class.
            return base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver);
        }
    
        public override SecurityTokenSerializer CreateSecurityTokenSerializer(SecurityTokenVersion version)
        {
            // Return your implementation of SecurityTokenProvider, if required.
            // This implementation delegates to the base class.
            return base.CreateSecurityTokenSerializer(version);
        }
    }
    
    Friend Class MyServiceCredentialsSecurityTokenManager
        Inherits ServiceCredentialsSecurityTokenManager
        Private credentials As MyServiceCredentials
    
        Public Sub New(ByVal credentials As MyServiceCredentials)
            MyBase.New(credentials)
            Me.credentials = credentials
    
        End Sub
    
    
        Public Overrides Function CreateSecurityTokenProvider(ByVal tokenRequirement As SecurityTokenRequirement) _
        As SecurityTokenProvider
            ' Return your implementation of SecurityTokenProvider, if required.
            ' This implementation delegates to the base class.
            Return MyBase.CreateSecurityTokenProvider(tokenRequirement)
    
        End Function
    
        Public Overrides Function CreateSecurityTokenAuthenticator( _
        ByVal tokenRequirement As SecurityTokenRequirement, _
        ByRef outOfBandTokenResolver As SecurityTokenResolver) _
        As SecurityTokenAuthenticator
            ' Return your implementation of SecurityTokenProvider, if required.
            ' This implementation delegates to the base class.
            Return MyBase.CreateSecurityTokenAuthenticator(tokenRequirement, outOfBandTokenResolver)
    
        End Function
    
    
        Public Overrides Function CreateSecurityTokenSerializer(ByVal version As SecurityTokenVersion) _
        As SecurityTokenSerializer
            ' Return your implementation of SecurityTokenProvider, if required.
            ' This implementation delegates to the base class.
            Return MyBase.CreateSecurityTokenSerializer(version)
    
        End Function
    End Class
    

애플리케이션 코드로부터 사용자 지정 서비스 자격 증명을 사용하려면

  1. ServiceHost 인스턴스를 만듭니다.

  2. Behaviors 컬렉션으로부터 시스템 제공 서비스 자격 증명 동작을 제거합니다.

  3. 사용자 지정 서비스 자격 증명 클래스의 새 인스턴스를 만들고 이 인스턴스를 Behaviors 컬렉션에 추가합니다.

    // Create a service host with a service type.
    ServiceHost serviceHost = new ServiceHost(typeof(Service));
    
    // Remove the default ServiceCredentials behavior.
    serviceHost.Description.Behaviors.Remove<ServiceCredentials>();
    
    // Add a custom service credentials instance to the collection.
    serviceHost.Description.Behaviors.Add(new MyServiceCredentials());
    
    ' Create a service host with a service type.
    Dim serviceHost As New ServiceHost(GetType(Service))
    
    ' Remove the default ServiceCredentials behavior.
    serviceHost.Description.Behaviors.Remove(Of ServiceCredentials)()
    
    ' Add a custom service credentials instance to the collection.
    serviceHost.Description.Behaviors.Add(New MyServiceCredentials())
    

"To create a configuration handler for custom client credentials" 및 "To register and use a custom client credentials configuration handler in the application configuration" 프로시저에서 이전에 설명한 단계에서 구성 지원을 추가합니다. 유일한 차이점은 구성 처리기의 기본 클래스로 ClientCredentialsElement 클래스 대신 ServiceCredentialsElement 클래스를 사용한다는 것입니다. 그런 다음 사용자 지정 서비스 자격 증명 요소는 시스템 제공 <serviceCredentials> 요소가 사용될 때 사용할 수 있습니다.

참고 항목