Aracılığıyla paylaş


Nasıl yapılır: Özel Güvenlik Belirteci Sağlayıcı Oluşturma

Bu konu başlığı altında, özel bir güvenlik belirteci sağlayıcısıyla yeni belirteç türlerinin nasıl oluşturulacağı ve sağlayıcının özel bir güvenlik belirteci yöneticisiyle tümleştirilmesi gösterilmektedir.

Not

Ad alanında System.IdentityModel.Tokens bulunan sistem tarafından sağlanan belirteçler gereksinimlerinizle eşleşmiyorsa özel bir belirteç sağlayıcısı oluşturun.

Güvenlik belirteci sağlayıcısı, istemci veya hizmet kimlik bilgilerindeki bilgilere göre bir güvenlik belirteci gösterimi oluşturur. Windows Communication Foundation (WCF) güvenliğinde özel güvenlik belirteci sağlayıcısını kullanmak için özel kimlik bilgileri ve güvenlik belirteci yöneticisi uygulamaları oluşturmanız gerekir.

Özel kimlik bilgileri ve güvenlik belirteci yöneticisi hakkında daha fazla bilgi için bkz . İzlenecek Yol: Özel İstemci ve Hizmet Kimlik Bilgileri Oluşturma.

Özel güvenlik belirteci sağlayıcısı oluşturmak için

  1. sınıfından SecurityTokenProvider türetilmiş yeni bir sınıf tanımlayın.

  2. GetTokenCore(TimeSpan) yöntemini uygulayın. yöntemi, güvenlik belirtecinin bir örneğini oluşturmak ve döndürmekten sorumludur. Aşağıdaki örnek adlı MySecurityTokenProviderbir sınıf oluşturur ve sınıfının bir örneğini X509SecurityToken döndürmek için yöntemini geçersiz kılarGetTokenCore(TimeSpan). Sınıf oluşturucu, sınıfının bir örneğini X509Certificate2 gerektirir.

    internal class MySecurityTokenProvider : SecurityTokenProvider
    {
        X509Certificate2 certificate;
    
        public MySecurityTokenProvider(X509Certificate2 certificate)
        {
            this.certificate = certificate;
        }
    
        protected override SecurityToken GetTokenCore(TimeSpan timeout)
        {
            return new X509SecurityToken(certificate);
        }
    }
    
    Friend Class MySecurityTokenProvider
        Inherits SecurityTokenProvider
        Private certificate As X509Certificate2
    
        Public Sub New(ByVal certificate As X509Certificate2)
            Me.certificate = certificate
    
        End Sub
    
        Protected Overrides Function GetTokenCore(ByVal timeout As TimeSpan) As SecurityToken
            Return New X509SecurityToken(certificate)
    
        End Function
    End Class
    

Özel güvenlik belirteci sağlayıcısını özel güvenlik belirteci yöneticisiyle tümleştirmek için

  1. sınıfından SecurityTokenManager türetilmiş yeni bir sınıf tanımlayın. (Aşağıdaki örnek, sınıfından ClientCredentialsSecurityTokenManager türetilen sınıfından SecurityTokenManager türetilir.)

  2. CreateSecurityTokenProvider(SecurityTokenRequirement) Geçersiz kılınmadıysa yöntemini geçersiz kılın.

    CreateSecurityTokenProvider(SecurityTokenRequirement) yöntemi, WCF güvenlik çerçevesi tarafından yöntemine geçirilen parametreye SecurityTokenRequirement uygun sınıfın bir örneğini SecurityTokenProvider döndürmekten sorumludur. Yöntemi uygun bir güvenlik belirteci parametresiyle çağrıldığında özel güvenlik belirteci sağlayıcısı uygulamasını (önceki yordamda oluşturulan) döndürecek şekilde değiştirin. Güvenlik belirteci yöneticisi hakkında daha fazla bilgi için bkz . İzlenecek Yol: Özel İstemci ve Hizmet Kimlik Bilgileri Oluşturma.

  3. Parametresine göre özel güvenlik belirteci sağlayıcınızı döndürmesini sağlamak için yöntemine SecurityTokenRequirement özel mantık ekleyin. Aşağıdaki örnek, belirteç gereksinimleri karşılanırsa özel güvenlik belirteci sağlayıcısını döndürür. Gereksinimler arasında X.509 güvenlik belirteci ve ileti yönü (belirtecin ileti çıkışı için kullanıldığı) yer alır. Diğer tüm durumlarda kod, diğer güvenlik belirteci gereksinimleri için sistem tarafından sağlanan davranışı korumak için temel sınıfı çağırır.

internal class MyClientCredentialsSecurityTokenManager:ClientCredentialsSecurityTokenManager
{
    ClientCredentials credentials;

    public MyClientCredentialsSecurityTokenManager(ClientCredentials credentials)
        : base(credentials)
    {
        this.credentials = credentials;
    }

    public override SecurityTokenProvider CreateSecurityTokenProvider(
        SecurityTokenRequirement tokenRequirement)
    {
        // Return your implementation of the SecurityTokenProvider based on the
        // tokenRequirement argument.
        SecurityTokenProvider result;
        if (tokenRequirement.TokenType == SecurityTokenTypes.X509Certificate)
        {
            MessageDirection direction = tokenRequirement.GetProperty<MessageDirection>(
                ServiceModelSecurityTokenRequirement.MessageDirectionProperty);
            if (direction == MessageDirection.Output)
            {
                result = new MySecurityTokenProvider(credentials.ClientCertificate.Certificate);
            }
            else
            {
                result = base.CreateSecurityTokenProvider(tokenRequirement);
            }
        }
        else
        {
            result = base.CreateSecurityTokenProvider(tokenRequirement);
        }

        return result;
    }
}

Friend Class MyClientCredentialsSecurityTokenManager
    Inherits ClientCredentialsSecurityTokenManager
    Private credentials As ClientCredentials


    Public Sub New(ByVal credentials As ClientCredentials)
        MyBase.New(credentials)
        Me.credentials = credentials

    End Sub


    Public Overrides Function CreateSecurityTokenProvider(ByVal tokenRequirement As SecurityTokenRequirement) As SecurityTokenProvider
        ' Return your implementation of the SecurityTokenProvider based on the 
        ' tokenRequirement argument.
        Dim result As SecurityTokenProvider
        If tokenRequirement.TokenType = SecurityTokenTypes.X509Certificate Then
            Dim direction As MessageDirection = tokenRequirement.GetProperty(Of MessageDirection) _
               (ServiceModelSecurityTokenRequirement.MessageDirectionProperty)
            If direction = MessageDirection.Output Then
                result = New MySecurityTokenProvider(credentials.ClientCertificate.Certificate)
            Else
                result = MyBase.CreateSecurityTokenProvider(tokenRequirement)
            End If
        Else
            result = MyBase.CreateSecurityTokenProvider(tokenRequirement)
        End If

        Return result

    End Function
End Class

Örnek

Aşağıda, ilgili SecurityTokenManager uygulamayla birlikte eksiksiz SecurityTokenProvider bir uygulama gösterilmektedir.

using System;
using System.IdentityModel.Selectors;
using System.IdentityModel.Tokens;
using System.Security.Cryptography.X509Certificates;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Security.Tokens;

namespace CustomProvider
{
    internal class MySecurityTokenProvider : SecurityTokenProvider
    {
        X509Certificate2 certificate;

        public MySecurityTokenProvider(X509Certificate2 certificate)
        {
            this.certificate = certificate;
        }

        protected override SecurityToken GetTokenCore(TimeSpan timeout)
        {
            return new X509SecurityToken(certificate);
        }
    }

    internal class MyClientCredentialsSecurityTokenManager:ClientCredentialsSecurityTokenManager
    {
        ClientCredentials credentials;

        public MyClientCredentialsSecurityTokenManager(ClientCredentials credentials)
            : base(credentials)
        {
            this.credentials = credentials;
        }

        public override SecurityTokenProvider CreateSecurityTokenProvider(
            SecurityTokenRequirement tokenRequirement)
        {
            // Return your implementation of the SecurityTokenProvider based on the
            // tokenRequirement argument.
            SecurityTokenProvider result;
            if (tokenRequirement.TokenType == SecurityTokenTypes.X509Certificate)
            {
                MessageDirection direction = tokenRequirement.GetProperty<MessageDirection>(
                    ServiceModelSecurityTokenRequirement.MessageDirectionProperty);
                if (direction == MessageDirection.Output)
                {
                    result = new MySecurityTokenProvider(credentials.ClientCertificate.Certificate);
                }
                else
                {
                    result = base.CreateSecurityTokenProvider(tokenRequirement);
                }
            }
            else
            {
                result = base.CreateSecurityTokenProvider(tokenRequirement);
            }

            return result;
        }
    }
}
Imports System.IdentityModel.Selectors
Imports System.IdentityModel.Tokens
Imports System.Security.Permissions
Imports System.Security.Cryptography.X509Certificates
Imports System.ServiceModel
Imports System.ServiceModel.Description
Imports System.ServiceModel.Security.Tokens

Friend Class MySecurityTokenProvider
    Inherits SecurityTokenProvider
    Private certificate As X509Certificate2

    Public Sub New(ByVal certificate As X509Certificate2)
        Me.certificate = certificate

    End Sub

    Protected Overrides Function GetTokenCore(ByVal timeout As TimeSpan) As SecurityToken
        Return New X509SecurityToken(certificate)

    End Function
End Class

Friend Class MyClientCredentialsSecurityTokenManager
    Inherits ClientCredentialsSecurityTokenManager
    Private credentials As ClientCredentials


    Public Sub New(ByVal credentials As ClientCredentials)
        MyBase.New(credentials)
        Me.credentials = credentials

    End Sub


    Public Overrides Function CreateSecurityTokenProvider(ByVal tokenRequirement As SecurityTokenRequirement) As SecurityTokenProvider
        ' Return your implementation of the SecurityTokenProvider based on the 
        ' tokenRequirement argument.
        Dim result As SecurityTokenProvider
        If tokenRequirement.TokenType = SecurityTokenTypes.X509Certificate Then
            Dim direction As MessageDirection = tokenRequirement.GetProperty(Of MessageDirection) _
               (ServiceModelSecurityTokenRequirement.MessageDirectionProperty)
            If direction = MessageDirection.Output Then
                result = New MySecurityTokenProvider(credentials.ClientCertificate.Certificate)
            Else
                result = MyBase.CreateSecurityTokenProvider(tokenRequirement)
            End If
        Else
            result = MyBase.CreateSecurityTokenProvider(tokenRequirement)
        End If

        Return result

    End Function
End Class

Ayrıca bkz.