Nasıl yapılır: Özel Güvenlik Belirteci Sağlayıcı Oluşturma
Bu konu başlığı altında, özel bir güvenlik belirteci sağlayıcısıyla yeni belirteç türlerinin nasıl oluşturulacağı ve sağlayıcının özel bir güvenlik belirteci yöneticisiyle tümleştirilmesi gösterilmektedir.
Not
Ad alanında System.IdentityModel.Tokens bulunan sistem tarafından sağlanan belirteçler gereksinimlerinizle eşleşmiyorsa özel bir belirteç sağlayıcısı oluşturun.
Güvenlik belirteci sağlayıcısı, istemci veya hizmet kimlik bilgilerindeki bilgilere göre bir güvenlik belirteci gösterimi oluşturur. Windows Communication Foundation (WCF) güvenliğinde özel güvenlik belirteci sağlayıcısını kullanmak için özel kimlik bilgileri ve güvenlik belirteci yöneticisi uygulamaları oluşturmanız gerekir.
Özel kimlik bilgileri ve güvenlik belirteci yöneticisi hakkında daha fazla bilgi için bkz . İzlenecek Yol: Özel İstemci ve Hizmet Kimlik Bilgileri Oluşturma.
Özel güvenlik belirteci sağlayıcısı oluşturmak için
sınıfından SecurityTokenProvider türetilmiş yeni bir sınıf tanımlayın.
GetTokenCore(TimeSpan) yöntemini uygulayın. yöntemi, güvenlik belirtecinin bir örneğini oluşturmak ve döndürmekten sorumludur. Aşağıdaki örnek adlı
MySecurityTokenProvider
bir sınıf oluşturur ve sınıfının bir örneğini X509SecurityToken döndürmek için yöntemini geçersiz kılarGetTokenCore(TimeSpan). Sınıf oluşturucu, sınıfının bir örneğini X509Certificate2 gerektirir.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
Özel güvenlik belirteci sağlayıcısını özel güvenlik belirteci yöneticisiyle tümleştirmek için
sınıfından SecurityTokenManager türetilmiş yeni bir sınıf tanımlayın. (Aşağıdaki örnek, sınıfından ClientCredentialsSecurityTokenManager türetilen sınıfından SecurityTokenManager türetilir.)
CreateSecurityTokenProvider(SecurityTokenRequirement) Geçersiz kılınmadıysa yöntemini geçersiz kılın.
CreateSecurityTokenProvider(SecurityTokenRequirement) yöntemi, WCF güvenlik çerçevesi tarafından yöntemine geçirilen parametreye SecurityTokenRequirement uygun sınıfın bir örneğini SecurityTokenProvider döndürmekten sorumludur. Yöntemi uygun bir güvenlik belirteci parametresiyle çağrıldığında özel güvenlik belirteci sağlayıcısı uygulamasını (önceki yordamda oluşturulan) döndürecek şekilde değiştirin. Güvenlik belirteci yöneticisi hakkında daha fazla bilgi için bkz . İzlenecek Yol: Özel İstemci ve Hizmet Kimlik Bilgileri Oluşturma.
Parametresine göre özel güvenlik belirteci sağlayıcınızı döndürmesini sağlamak için yöntemine SecurityTokenRequirement özel mantık ekleyin. Aşağıdaki örnek, belirteç gereksinimleri karşılanırsa özel güvenlik belirteci sağlayıcısını döndürür. Gereksinimler arasında X.509 güvenlik belirteci ve ileti yönü (belirtecin ileti çıkışı için kullanıldığı) yer alır. Diğer tüm durumlarda kod, diğer güvenlik belirteci gereksinimleri için sistem tarafından sağlanan davranışı korumak için temel sınıfı çağırır.
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
Örnek
Aşağıda, ilgili SecurityTokenManager uygulamayla birlikte eksiksiz SecurityTokenProvider bir uygulama gösterilmektedir.
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