Dela via


Gör så här: Skapa en anpassad säkerhetstokenprovider

Det här avsnittet visar hur du skapar nya tokentyper med en anpassad säkerhetstokenprovider och hur du integrerar providern med en anpassad säkerhetstokenhanterare.

Kommentar

Skapa en anpassad tokenprovider om de systembaserade token som finns i System.IdentityModel.Tokens namnområdet inte matchar dina krav.

Providern för säkerhetstoken skapar en säkerhetstokenrepresentation baserat på information i klientens eller tjänstens autentiseringsuppgifter. Om du vill använda den anpassade säkerhetstokenprovidern i WCF-säkerhet (Windows Communication Foundation) måste du skapa anpassade autentiseringsuppgifter och implementeringar av säkerhetstokenhanteraren.

Mer information om anpassade autentiseringsuppgifter och säkerhetstokenhanteraren finns i Genomgång: Skapa anpassade klient- och tjänstautentiseringsuppgifter.

Så här skapar du en anpassad säkerhetstokenprovider

  1. Definiera en ny klass som härleds SecurityTokenProvider från klassen.

  2. GetTokenCore(TimeSpan) Implementera metoden. Metoden ansvarar för att skapa och returnera en instans av säkerhetstoken. I följande exempel skapas en klass med namnet MySecurityTokenProvideroch åsidosätter GetTokenCore(TimeSpan) metoden för att returnera en instans av X509SecurityToken klassen. Klasskonstruktorn kräver en instans av X509Certificate2 klassen.

    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
    

Så här integrerar du en anpassad säkerhetstokenprovider med en anpassad säkerhetstokenhanterare

  1. Definiera en ny klass som härleds SecurityTokenManager från klassen. (Exemplet nedan härleds från ClientCredentialsSecurityTokenManager klassen, som härleds från SecurityTokenManager klassen.)

  2. Åsidosätt metoden om den CreateSecurityTokenProvider(SecurityTokenRequirement) inte redan har åsidosatts.

    Metoden CreateSecurityTokenProvider(SecurityTokenRequirement) ansvarar för att returnera en instans av klassen SecurityTokenProvider som är lämplig för parametern SecurityTokenRequirement som skickas till metoden av WCF-säkerhetsramverket. Ändra metoden för att returnera implementeringen av den anpassade säkerhetstokenprovidern (som skapades i föregående procedur) när metoden anropas med en lämplig säkerhetstokenparameter. Mer information om säkerhetstokenhanteraren finns i Genomgång: Skapa anpassade klient- och tjänstautentiseringsuppgifter.

  3. Lägg till anpassad logik i metoden så att den kan returnera din anpassade säkerhetstokenprovider baserat på parametern SecurityTokenRequirement . Följande exempel returnerar providern för anpassad säkerhetstoken om tokenkraven uppfylls. Kraven omfattar en X.509-säkerhetstoken och meddelanderiktningen (att token används för meddelandeutdata). I alla andra fall anropar koden basklassen för att upprätthålla det systemspecifika beteendet för andra krav på säkerhetstoken.

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

Exempel

Följande visar en fullständig SecurityTokenProvider implementering tillsammans med en motsvarande SecurityTokenManager implementering.

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

Se även