Vorgehensweise: Erstellen eines benutzerdefinierten SicherheitstokenanbietersHow to: Create a Custom Security Token Provider

In diesem Thema wird beschrieben, wie Sie neue Tokentypen mit einem benutzerdefinierten Sicherheitstokenanbieter erstellen und den Anbieter in einen benutzerdefinierten Sicherheitstoken-Manager integrieren.This topic shows how to create new token types with a custom security token provider and how to integrate the provider with a custom security token manager.

Hinweis

Erstellen Sie einen benutzerdefinierten Tokenanbieter, wenn die im System.IdentityModel.Tokens-Namespace gefundenen vom System bereitgestellten Token Ihren Anforderungen nicht entsprechen.Create a custom token provider if the system-provided tokens found in the System.IdentityModel.Tokens namespace do not match your requirements.

Der Sicherheitstokenanbieter erstellt eine Sicherheitstokendarstellung basierend auf Daten in den Client- oder Dienstanmeldeinformationen.The security token provider creates a security token representation based on information in the client or service credentials. Um den benutzerdefinierten Sicherheitstokenanbieter in Windows Communication Foundation (WCF)-Sicherheit zu verwenden, müssen Sie benutzerdefinierte Anmeldeinformationen und Sicherheitstoken-managerimplementierungen erstellen.To use the custom security token provider in Windows Communication Foundation (WCF) security, you must create custom credentials and security token manager implementations.

Weitere Informationen zu benutzerdefinierten Anmeldeinformationen und Sicherheitstoken-Manager finden Sie unter der Exemplarische Vorgehensweise: Erstellen von benutzerdefinierten Client- und Dienstanmeldeinformationen.For more information about custom credentials and security token manager see the Walkthrough: Creating Custom Client and Service Credentials.

Weitere Informationen zu Anmeldeinformationen, token-Manager "," Anbieter "und" Authentifikator Sicherheitsklassen, finden Sie unter der Sicherheitsarchitektur.For more information about credentials, security token manager, provider and authenticator classes, see the Security Architecture.

So erstellen Sie einen benutzerdefinierten SicherheitstokenanbieterTo create a custom security token provider

  1. Definieren Sie eine neue von der SecurityTokenProvider-Klasse abgeleitete Klasse.Define a new class derived from the SecurityTokenProvider class.

  2. Implementieren Sie die GetTokenCore(TimeSpan)-Methode.Implement the GetTokenCore(TimeSpan) method. Die Methode ist für die Erstellung und die Rückgabe einer Instanz des Sicherheitstokens verantwortlich.The method is responsible for creating and returning an instance of the security token. Im folgenden Beispiel wird eine Klasse mit der Bezeichnung MySecurityTokenProvider erstellt und die GetTokenCore(TimeSpan)-Methode überschrieben, um eine Instanz der X509SecurityToken-Klasse zurückzugeben.The following example creates a class named MySecurityTokenProvider, and overrides the GetTokenCore(TimeSpan) method to return an instance of the X509SecurityToken class. Der Klassenkonstruktor erfordert eine neue Instanz der X509Certificate2-Klasse.The class constructor requires an instance of the X509Certificate2 class.

    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 
    

So integrieren Sie einen benutzerdefinierten Sicherheitstokenanbieter in einen benutzerdefinierten Sicherheitstoken-ManagerTo integrate a custom security token provider with a custom security token manager

  1. Definieren Sie eine neue von der SecurityTokenManager-Klasse abgeleitete Klasse.Define a new class derived from the SecurityTokenManager class. (Das nachfolgende Beispiel ist von der ClientCredentialsSecurityTokenManager-Klasse abgeleitet, die von der SecurityTokenManager-Klasse abgeleitet ist.)(The example below derives from the ClientCredentialsSecurityTokenManager class, which derives from the SecurityTokenManager class.)

  2. Überschreiben Sie die CreateSecurityTokenProvider(SecurityTokenRequirement)-Methode, wenn sie noch nicht überschrieben ist.Override the CreateSecurityTokenProvider(SecurityTokenRequirement) method if is not already overridden.

    Die CreateSecurityTokenProvider(SecurityTokenRequirement) Methode ist verantwortlich für die Rückgabe einer Instanz von der SecurityTokenProvider Klasse, die die SecurityTokenRequirement Parameter an die Methode übergeben, durch das Framework der WCF-Sicherheit.The CreateSecurityTokenProvider(SecurityTokenRequirement) method is responsible for returning an instance of the SecurityTokenProvider class appropriate to the SecurityTokenRequirement parameter passed to the method by the WCF security framework. Ändern Sie die Methode zur Rückgabe der Implementierung des benutzerdefinierten Sicherheitstokenanbieters (die mit dem vorherigen Verfahren erstellt wurde), wenn die Methode mit einem entsprechenden Sicherheitstokenparameter aufgerufen wird.Modify the method to return the custom security token provider implementation (created in the previous procedure) when the method is called with an appropriate security token parameter. Weitere Informationen zu der Sicherheitstoken-Manager finden Sie unter der Exemplarische Vorgehensweise: Erstellen von benutzerdefinierten Client- und Dienstanmeldeinformationen.For more information about the security token manager, see the Walkthrough: Creating Custom Client and Service Credentials.

  3. Fügen Sie benutzerdefinierte Logik zur Methode hinzu, um diese zu befähigen, den benutzerdefinierten Sicherheitstokenanbieter basierend auf dem SecurityTokenRequirement-Parameter zurückzugeben.Add custom logic to the method to enable it to return your custom security token provider based on the SecurityTokenRequirement parameter. Im folgenden Beispiel wird der benutzerdefinierte Sicherheitstokenanbieter zurückgegeben, wenn die Tokenanforderungen erfüllt werden.The following sample returns the custom security token provider if the token requirements are met. Die Anforderungen umfassen ein X.509-Sicherheitstoken und die Nachrichtenrichtung (die das Token für die Nachrichtenausgabe verwendet).The requirements include an X.509 security token and the message direction (that the token is used for message output). In allen anderen Fällen ruft der Code die Basisklasse ab, um das vom System bereitgestellte Verhalten für andere Sicherheitstokenanforderungen zu verwalten.For all other cases, the code calls the base class to maintain the system-provided behavior for other security token requirements.

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 'New
    
    
    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 

BeispielExample

Im Folgenden wird eine vollständige SecurityTokenProvider-Implementierung zusammen mit einer entsprechenden SecurityTokenManager-Implementierung gezeigt.The following shows a complete SecurityTokenProvider implementation along with a corresponding SecurityTokenManager implementation.

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

[assembly: SecurityPermission(SecurityAction.RequestMinimum, Execution = true)]
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
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

<assembly: SecurityPermission(SecurityAction.RequestMinimum, Execution := True)>
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 'New
    
    
    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 

Siehe auchSee Also

SecurityTokenProvider
SecurityTokenRequirement
SecurityTokenManager
X509SecurityToken
Exemplarische Vorgehensweise: Erstellen von benutzerdefinierten Client- und DienstanmeldeinformationenWalkthrough: Creating Custom Client and Service Credentials
Vorgehensweise: Erstellen eines benutzerdefinierten SicherheitstokenauthentifizierersHow to: Create a Custom Security Token Authenticator
SicherheitsarchitekturSecurity Architecture