Aracılığıyla paylaş


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

  1. sınıfından SecurityTokenAuthenticator türetilmiş yeni bir sınıf tanımlayın.

  2. 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 truefalse .

  3. 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

  1. Arabirimi uygulayan IAuthorizationPolicy yeni bir sınıf tanımlayın.

  2. 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.

  3. 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.

  4. 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ülebilir false . 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

  1. CreateSecurityTokenAuthenticator Özel güvenlik belirteci yöneticisi uygulamanızda yöntemini geçersiz kılın.

  2. 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
    

Ayrıca bkz.