Postupy: Vytvoření vlastního zprostředkovatele tokenů zabezpečení

Toto téma ukazuje, jak vytvořit nové typy tokenů s vlastním poskytovatelem tokenů zabezpečení a jak integrovat zprostředkovatele s vlastním správcem tokenů zabezpečení.

Poznámka:

Pokud systémové tokeny nalezené v System.IdentityModel.Tokens oboru názvů neodpovídají vašim požadavkům, vytvořte vlastního zprostředkovatele tokenů.

Zprostředkovatel tokenu zabezpečení vytvoří reprezentaci tokenu zabezpečení na základě informací v přihlašovacích údajích klienta nebo služby. Pokud chcete použít vlastního zprostředkovatele tokenů zabezpečení v zabezpečení WCF (Windows Communication Foundation), musíte vytvořit vlastní přihlašovací údaje a implementace správce tokenů zabezpečení.

Další informace o vlastních přihlašovacích údaji a správci tokenů zabezpečení naleznete v části Návod: Vytvoření vlastních přihlašovacích údajů klienta a služby.

Vytvoření vlastního zprostředkovatele tokenů zabezpečení

  1. Definujte novou třídu odvozenou SecurityTokenProvider z třídy.

  2. Implementujte metodu GetTokenCore(TimeSpan) . Tato metoda zodpovídá za vytvoření a vrácení instance tokenu zabezpečení. Následující příklad vytvoří třídu s názvem MySecurityTokenProvidera přepíše GetTokenCore(TimeSpan) metodu pro vrácení instance X509SecurityToken třídy. Konstruktor třídy vyžaduje instanci X509Certificate2 třídy.

    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
    

Integrace vlastního zprostředkovatele tokenů zabezpečení s vlastním správcem tokenů zabezpečení

  1. Definujte novou třídu odvozenou SecurityTokenManager z třídy. (Následující příklad je odvozen od ClientCredentialsSecurityTokenManager třídy, která je odvozena z SecurityTokenManager třídy.)

  2. Přepište metodu CreateSecurityTokenProvider(SecurityTokenRequirement) , pokud ještě není přepsána.

    Tato CreateSecurityTokenProvider(SecurityTokenRequirement) metoda zodpovídá za vrácení instance SecurityTokenProvider třídy odpovídající SecurityTokenRequirement parametru předaného metodě architekturou zabezpečení WCF. Upravte metodu tak, aby vracela vlastní implementaci zprostředkovatele tokenu zabezpečení (vytvořenou v předchozím postupu), když je volána metoda s odpovídajícím parametrem tokenu zabezpečení. Další informace o správci tokenů zabezpečení naleznete v návodu : Vytvoření vlastních přihlašovacích údajů klienta a služby.

  3. Přidejte do metody vlastní logiku, která jí umožní vrátit vlastního zprostředkovatele tokenu zabezpečení na základě parametru SecurityTokenRequirement . Následující ukázka vrátí vlastního zprostředkovatele tokenu zabezpečení, pokud jsou splněny požadavky na token. Požadavky zahrnují token zabezpečení X.509 a směr zprávy (že se token používá pro výstup zprávy). Ve všech ostatních případech kód volá základní třídu, aby zachoval chování poskytované systémem pro jiné požadavky na token zabezpečení.

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

Příklad

Následující příklad ukazuje úplnou SecurityTokenProvider implementaci spolu s odpovídající SecurityTokenManager implementací.

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

Viz také