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
Definieer een nieuwe klasse die is afgeleid van de SecurityTokenProvider klasse.
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
MySecurityTokenProvider
gemaakt 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
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.)
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.
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