Nasıl yapılır: Özel güvenlik belirteci doğrulayıcı oluşturma
Bu konuda, özel bir güvenlik belirteci kimlik doğrulayıcısı oluşturma ve bunu özel bir güvenlik belirteci yöneticisiyle tümleştirme adımları gösterilmektedir. Güvenlik belirteci doğrulayıcı, gelen iletiyle sağlanan bir güvenlik belirtecinin içeriğini doğrular. Doğrulama başarılı olursa, doğrulayıcı değerlendirildiğinde bir talep kümesi döndüren bir örnek koleksiyonu IAuthorizationPolicy döndürür.
Windows Communication Foundation'da (WCF) özel bir güvenlik belirteci doğrulayıcı kullanmak için, önce özel kimlik bilgileri ve güvenlik belirteci yöneticisi uygulamaları oluşturmanız gerekir. Özel kimlik bilgileri ve güvenlik belirteci yöneticisi oluşturma hakkında daha fazla bilgi için bkz . İzlenecek Yol: Özel İstemci ve Hizmet Kimlik Bilgileri Oluşturma.
Yordamlar
Özel güvenlik belirteci doğrulayıcı oluşturmak için
sınıfından SecurityTokenAuthenticator türetilmiş yeni bir sınıf tanımlayın.
CanValidateTokenCore yöntemini geçersiz kılın. yöntemi, özel kimlik doğrulayıcının gelen belirteç türünü doğrulayıp doğrulayamayacağına bağlı olarak veya döndürür
true
false
.ValidateTokenCore yöntemini geçersiz kılın. Bu yöntemin belirteç içeriğini uygun şekilde doğrulaması gerekir. Belirteç doğrulama adımını geçerse bir örnek koleksiyonu IAuthorizationPolicy döndürür. Aşağıdaki örnek, bir sonraki yordamda oluşturulacak özel yetkilendirme ilkesi uygulamasını kullanır.
internal class MySecurityTokenAuthenticator : SecurityTokenAuthenticator { protected override bool CanValidateTokenCore(SecurityToken token) { // Check that the incoming token is a username token type that // can be validated by this implementation. return (token is UserNameSecurityToken); } protected override ReadOnlyCollection<IAuthorizationPolicy> ValidateTokenCore(SecurityToken token) { UserNameSecurityToken userNameToken = token as UserNameSecurityToken; // Validate the information contained in the username token. For demonstration // purposes, this code just checks that the user name matches the password. if (userNameToken.UserName != userNameToken.Password) { throw new SecurityTokenValidationException("Invalid user name or password"); } // Create just one Claim instance for the username token - the name of the user. DefaultClaimSet userNameClaimSet = new DefaultClaimSet( ClaimSet.System, new Claim(ClaimTypes.Name, userNameToken.UserName, Rights.PossessProperty)); List<IAuthorizationPolicy> policies = new List<IAuthorizationPolicy>(1); policies.Add(new MyAuthorizationPolicy(userNameClaimSet)); return policies.AsReadOnly(); } }
Friend Class MySecurityTokenAuthenticator Inherits SecurityTokenAuthenticator Protected Overrides Function CanValidateTokenCore(ByVal token As SecurityToken) As Boolean ' Check that the incoming token is a username token type that ' can be validated by this implementation. Return (TypeOf token Is UserNameSecurityToken) End Function Protected Overrides Function ValidateTokenCore(ByVal token As SecurityToken) As ReadOnlyCollection(Of IAuthorizationPolicy) Dim userNameToken = TryCast(token, UserNameSecurityToken) ' Validate the information contained in the username token. For demonstration ' purposes, this code just checks that the user name matches the password. If userNameToken.UserName <> userNameToken.Password Then Throw New SecurityTokenValidationException("Invalid user name or password") End If ' Create just one Claim instance for the username token - the name of the user. Dim userNameClaimSet As New DefaultClaimSet(ClaimSet.System, _ New Claim(ClaimTypes.Name, _ userNameToken.UserName, _ Rights.PossessProperty)) Dim policies As New List(Of IAuthorizationPolicy)(1) policies.Add(New MyAuthorizationPolicy(userNameClaimSet)) Return policies.AsReadOnly() End Function End Class
Önceki kod yönteminde CanValidateToken(SecurityToken) bir yetkilendirme ilkeleri koleksiyonu döndürür. WCF, bu arabirimin genel bir uygulamasını sağlamaz. Aşağıdaki yordamda, kendi gereksinimleriniz için bunun nasıl gerçekleştirileceği gösterilmektedir.
Özel yetkilendirme ilkesi oluşturmak için
Arabirimi uygulayan IAuthorizationPolicy yeni bir sınıf tanımlayın.
Id Salt okunur özelliğini uygulayın. Bu özelliği uygulamanın bir yolu, sınıf oluşturucusunda genel olarak benzersiz bir tanımlayıcı (GUID) oluşturmak ve bu özelliğin değeri her istenildiğinde döndürmektir.
Issuer Salt okunur özelliğini uygulayın. Bu özelliğin belirteçten alınan talep kümelerinin verenini döndürmesi gerekir. Bu veren, belirtecin verenine veya belirteç içeriğini doğrulamadan sorumlu bir yetkiliye karşılık gelir. Aşağıdaki örnek, önceki yordamda oluşturulan özel güvenlik belirteci doğrulayıcısından bu sınıfa geçirilen veren talebi kullanır. Özel güvenlik belirteci doğrulayıcı, kullanıcı adı belirtecinin verenini System temsil etmek için sistem tarafından sağlanan talep kümesini (özellik tarafından döndürülen) kullanır.
Evaluate yöntemini uygulayın. Bu yöntem sınıfın EvaluationContext bir örneğini (bağımsız değişken olarak geçirilir) gelen güvenlik belirteci içeriğini temel alan taleplerle doldurur. yöntemi, değerlendirme tamamlandığında döndürür
true
. Uygulamanın değerlendirme bağlamı için ek bilgi sağlayan diğer yetkilendirme ilkelerinin varlığına bağlı olduğu durumlarda, gerekli bilgiler henüz değerlendirme bağlamında mevcut değilse bu yöntem döndürülebilirfalse
. Bu durumda WCF, gelen ileti için oluşturulan diğer tüm yetkilendirme ilkelerini değerlendirdikten sonra bu yetkilendirme ilkelerinden en az biri değerlendirme bağlamını değiştirdiyse yöntemini yeniden çağırır.internal class MyAuthorizationPolicy : IAuthorizationPolicy { string id; ClaimSet tokenClaims; ClaimSet issuer; public MyAuthorizationPolicy(ClaimSet tokenClaims) { if (tokenClaims == null) { throw new ArgumentNullException("tokenClaims"); } this.issuer = tokenClaims.Issuer; this.tokenClaims = tokenClaims; this.id = Guid.NewGuid().ToString(); } public ClaimSet Issuer { get { return issuer; } } public string Id { get { return id; } } public bool Evaluate(EvaluationContext evaluationContext, ref object state) { // Add the token claim set to the evaluation context. evaluationContext.AddClaimSet(this, tokenClaims); // Return true if the policy evaluation is finished. return true; } }
Friend Class MyAuthorizationPolicy Implements IAuthorizationPolicy Private _id As String Private _tokenClaims As ClaimSet Private _issuer As ClaimSet Public Sub New(ByVal tokenClaims As ClaimSet) If _tokenClaims Is Nothing Then Throw New ArgumentNullException("tokenClaims") End If Me._issuer = tokenClaims.Issuer Me._tokenClaims = tokenClaims Me._id = Guid.NewGuid().ToString() End Sub Public ReadOnly Property Issuer() As ClaimSet Implements IAuthorizationPolicy.Issuer Get Return _issuer End Get End Property Public ReadOnly Property Id() As String Implements System.IdentityModel.Policy.IAuthorizationComponent.Id Get Return _id End Get End Property Public Function Evaluate(ByVal evaluationContext As EvaluationContext, _ ByRef state As Object) As Boolean Implements IAuthorizationPolicy.Evaluate ' Add the token claim set to the evaluation context. evaluationContext.AddClaimSet(Me, _tokenClaims) ' Return true if the policy evaluation is finished. Return True End Function End Class
İzlenecek yol: Özel İstemci ve Hizmet Kimlik Bilgileri Oluşturma, özel kimlik bilgilerinin ve özel güvenlik belirteci yöneticisinin nasıl oluşturulacağını açıklar. Burada oluşturulan özel güvenlik belirteci doğrulayıcısını kullanmak için, güvenlik belirteci yöneticisinin bir uygulaması yönteminden CreateSecurityTokenAuthenticator özel kimlik doğrulayıcıyı döndürecek şekilde değiştirilir. uygun bir güvenlik belirteci gereksinimi geçirildiğinde yöntemi bir kimlik doğrulayıcı döndürür.
Özel güvenlik belirteci kimlik doğrulayıcısını özel bir güvenlik belirteci yöneticisiyle tümleştirmek için
CreateSecurityTokenAuthenticator Özel güvenlik belirteci yöneticisi uygulamanızda yöntemini geçersiz kılın.
parametresine göre özel güvenlik belirteci kimlik doğrulayıcınızı döndürmesini sağlamak için yöntemine SecurityTokenRequirement mantık ekleyin. Belirteç gereksinimleri belirteci türü bir kullanıcı adıysa (özellik tarafından temsil edilir) ve güvenlik belirteci doğrulayıcının UserName istendiği ileti yönü giriş ise (alanla Input temsil edilir) aşağıdaki örnek özel bir güvenlik belirteci doğrulayıcı döndürür.
internal class MyServiceCredentialsSecurityTokenManager : ServiceCredentialsSecurityTokenManager { ServiceCredentials credentials; public MyServiceCredentialsSecurityTokenManager(ServiceCredentials credentials) : base(credentials) { this.credentials = credentials; } public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator (SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver) { // Return your implementation of the SecurityTokenProvider based on the // tokenRequirement argument. SecurityTokenAuthenticator result; if (tokenRequirement.TokenType == SecurityTokenTypes.UserName) { MessageDirection direction = tokenRequirement.GetProperty<MessageDirection> (ServiceModelSecurityTokenRequirement.MessageDirectionProperty); if (direction == MessageDirection.Input) { outOfBandTokenResolver = null; result = new MySecurityTokenAuthenticator(); } else { result = base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver); } } else { result = base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver); } return result; } }
Friend Class MyServiceCredentialsSecurityTokenManager Inherits ServiceCredentialsSecurityTokenManager Private credentials As ServiceCredentials Public Sub New(ByVal credentials As ServiceCredentials) MyBase.New(credentials) Me.credentials = credentials End Sub Public Overrides Function CreateSecurityTokenAuthenticator(ByVal tokenRequirement As SecurityTokenRequirement, _ <System.Runtime.InteropServices.Out()> _ ByRef outOfBandTokenResolver _ As SecurityTokenResolver) As SecurityTokenAuthenticator ' Return your implementation of the SecurityTokenProvider based on the ' tokenRequirement argument. Dim result As SecurityTokenAuthenticator If tokenRequirement.TokenType = SecurityTokenTypes.UserName Then Dim direction = tokenRequirement.GetProperty(Of MessageDirection)(ServiceModelSecurityTokenRequirement.MessageDirectionProperty) If direction = MessageDirection.Input Then outOfBandTokenResolver = Nothing result = New MySecurityTokenAuthenticator() Else result = MyBase.CreateSecurityTokenAuthenticator(tokenRequirement, _ outOfBandTokenResolver) End If Else result = MyBase.CreateSecurityTokenAuthenticator(tokenRequirement, _ outOfBandTokenResolver) End If Return result End Function End Class