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í
Definujte novou třídu odvozenou SecurityTokenProvider z třídy.
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
MySecurityTokenProvider
a 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í
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.)
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.
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