Delen via


Procedure: Een aangepaste beveiligingstokenprovider maken

In dit onderwerp wordt beschreven hoe u nieuwe tokentypen maakt met een aangepaste beveiligingstokenprovider en hoe u de provider integreert met een aangepast beveiligingstokenbeheer.

Notitie

Maak een aangepaste tokenprovider als de door het systeem geleverde tokens in de System.IdentityModel.Tokens naamruimte niet voldoen aan uw vereisten.

De beveiligingstokenprovider maakt een beveiligingstokenweergave op basis van informatie in de client- of servicereferenties. Als u de aangepaste beveiligingstokenprovider in WCF-beveiliging (Windows Communication Foundation) wilt gebruiken, moet u aangepaste referenties en implementaties voor beveiligingstokenbeheer maken.

Zie het overzicht: Aangepaste client- en servicereferenties maken voor meer informatie over aangepaste referenties en beveiligingstokenbeheer.

Een aangepaste beveiligingstokenprovider maken

  1. Definieer een nieuwe klasse die is afgeleid van de SecurityTokenProvider klasse.

  2. Implementeer de GetTokenCore(TimeSpan) methode. De methode is verantwoordelijk voor het maken en retourneren van een exemplaar van het beveiligingstoken. In het volgende voorbeeld wordt een klasse met de naam MySecurityTokenProvidergemaakt en wordt de GetTokenCore(TimeSpan) methode overschreven om een exemplaar van de X509SecurityToken klasse te retourneren. De klasseconstructor vereist een exemplaar van de X509Certificate2 klasse.

    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
    

Een aangepaste beveiligingstokenprovider integreren met een aangepast beveiligingstokenbeheer

  1. Definieer een nieuwe klasse die is afgeleid van de SecurityTokenManager klasse. (Het onderstaande voorbeeld is afgeleid van de ClientCredentialsSecurityTokenManager klasse, die is afgeleid van de SecurityTokenManager klasse.)

  2. Overschrijf de CreateSecurityTokenProvider(SecurityTokenRequirement) methode als deze nog niet is overschreven.

    De CreateSecurityTokenProvider(SecurityTokenRequirement) methode is verantwoordelijk voor het retourneren van een exemplaar van de SecurityTokenProvider klasse dat geschikt is voor de SecurityTokenRequirement parameter die is doorgegeven aan de methode door het WCF-beveiligingsframework. Wijzig de methode om de implementatie van de aangepaste beveiligingstokenprovider te retourneren (gemaakt in de vorige procedure) wanneer de methode wordt aangeroepen met een juiste beveiligingstokenparameter. Zie het overzicht: Aangepaste client- en servicereferenties maken voor meer informatie over het beheer van beveiligingstokens.

  3. Voeg aangepaste logica toe aan de methode om deze in te schakelen voor het retourneren van uw aangepaste beveiligingstokenprovider op basis van de SecurityTokenRequirement parameter. In het volgende voorbeeld wordt de aangepaste beveiligingstokenprovider geretourneerd als aan de tokenvereisten wordt voldaan. De vereisten omvatten een X.509-beveiligingstoken en de berichtrichting (dat het token wordt gebruikt voor berichtuitvoer). Voor alle andere gevallen roept de code de basisklasse aan om het door het systeem geleverde gedrag te behouden voor andere vereisten voor beveiligingstokens.

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

Opmerking

Hieronder ziet u een volledige SecurityTokenProvider implementatie, samen met een bijbehorende SecurityTokenManager implementatie.

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

Zie ook