Aracılığıyla paylaş


Nasıl yapılır: Özel İstemci Kimliği Doğrulayıcı Oluşturma

Windows Communication Foundation'ın (WCF) kimlik özelliği, istemcinin hizmetin beklenen kimliğini önceden belirtmesini sağlar. Bir sunucu istemcide kimliğini doğrulasa, kimlik beklenen kimliğe karşı denetlenür. (Kimliğin ve nasıl çalıştığının açıklaması için bkz. Hizmet Kimliği ve Kimlik Doğrulaması.)

Gerekirse, doğrulama özel kimlik doğrulayıcı kullanılarak özelleştirilebilir. Örneğin, ek hizmet kimliği doğrulama denetimleri gerçekleştirebilirsiniz. Bu örnekte, özel kimlik doğrulayıcı sunucudan döndürülen X.509 sertifikasındaki ek talepleri denetler. Örnek uygulama için bkz . Hizmet Kimliği Örneği.

EndpointIdentity sınıfını genişletmek için

  1. sınıfından türetilen EndpointIdentity yeni bir sınıf tanımlayın. Bu örnekte uzantısını OrgEndpointIdentityadlandırabilirsiniz.

  2. Hizmetten döndürülen güvenlik belirtecindeki taleplere karşı kimlik denetimini gerçekleştirmek için genişletilmiş IdentityVerifier sınıf tarafından kullanılacak özelliklerle birlikte özel üyeler ekleyin. Bu örnek bir özelliği tanımlar: OrganizationClaim özelliği.

    public class OrgEndpointIdentity : EndpointIdentity
    {
        private string orgClaim;
        public OrgEndpointIdentity(string orgName)
        {
            orgClaim = orgName;
        }
    
        public string OrganizationClaim
        {
            get { return orgClaim; }
            set { orgClaim = value; }
        }
    }
    
    Public Class OrgEndpointIdentity
        Inherits EndpointIdentity
        Private orgClaim As String
    
        Public Sub New(ByVal orgName As String)
            orgClaim = orgName
        End Sub
    
        Public Property OrganizationClaim() As String
            Get
                Return orgClaim
            End Get
            Set(ByVal value As String)
                orgClaim = value
            End Set
        End Property
    End Class
    

IdentityVerifier sınıfını genişletmek için

  1. öğesinden IdentityVerifiertüretilen yeni bir sınıf tanımlayın. Bu örnekte uzantısını CustomIdentityVerifieradlandırabilirsiniz.

    public class CustomIdentityVerifier : IdentityVerifier
    {
        // Code to be added.
        public override bool CheckAccess(EndpointIdentity identity, AuthorizationContext authContext)
        {
            throw new Exception("The method or operation is not implemented.");
        }
    
        public override bool TryGetIdentity(EndpointAddress reference, out EndpointIdentity identity)
        {
            throw new Exception("The method or operation is not implemented.");
        }
    }
    
    Public Class CustomIdentityVerifier
        Inherits IdentityVerifier
        ' Code to be added.
    
        Public Overrides Function CheckAccess(ByVal identity As EndpointIdentity, _
                                              ByVal authContext As AuthorizationContext) As Boolean
            Throw New Exception("The method or operation is not implemented.")
        End Function
    
        Public Overrides Function TryGetIdentity(ByVal reference As EndpointAddress, _
                                                 <System.Runtime.InteropServices.Out()> ByRef identity As EndpointIdentity) As Boolean
            Throw New Exception("The method or operation is not implemented.")
        End Function
    End Class
    
  2. CheckAccess yöntemini geçersiz kılın. yöntemi, kimlik denetiminin başarılı mı yoksa başarısız mı olduğunu belirler.

  3. yöntemi iki CheckAccess parametreye sahiptir. birincisi sınıfının bir örneğidir EndpointIdentity . İkincisi sınıfının bir örneğidir AuthorizationContext .

    Yöntem uygulamasında, sınıfının özelliği AuthorizationContext tarafından ClaimSets döndürülen taleplerin koleksiyonunu inceleyin ve gerektiği gibi kimlik doğrulama denetimleri gerçekleştirin. Bu örnek, "Ayırt Edici Ad" türünde herhangi bir talep bularak başlar ve ardından adı (OrgEndpointIdentity uzantısıyla EndpointIdentity karşılaştırır.

    public override bool CheckAccess(EndpointIdentity identity, AuthorizationContext authContext)
    {
        bool returnvalue = false;
    
        foreach (ClaimSet claimset in authContext.ClaimSets)
        {
            foreach (Claim claim in claimset)
            {
                if (claim.ClaimType == "http://schemas.microsoft.com/ws/2005/05/identity/claims/x500distinguishedname")
                {
                    X500DistinguishedName name = (X500DistinguishedName)claim.Resource;
                    if (name.Name.Contains(((OrgEndpointIdentity)identity).OrganizationClaim))
                    {
                        Console.WriteLine("Claim Type: {0}", claim.ClaimType);
                        Console.WriteLine("Right: {0}", claim.Right);
                        Console.WriteLine("Resource: {0}", claim.Resource);
                        Console.WriteLine();
                        returnvalue = true;
                    }
                }
            }
        }
        return returnvalue;
    }
    
    
    Public Overrides Function CheckAccess(ByVal identity As EndpointIdentity, _
                                          ByVal authContext As AuthorizationContext) As Boolean
    
        Dim returnvalue = False
        For Each claimset In authContext.ClaimSets
            For Each claim In claimset
                If claim.ClaimType = "http://schemas.microsoft.com/ws/2005/05/identity/claims/x500distinguishedname" Then
                    Dim name = CType(claim.Resource, X500DistinguishedName)
                    If name.Name.Contains((CType(identity, OrgEndpointIdentity)).OrganizationClaim) Then
                        Console.WriteLine("Claim Type: {0}", claim.ClaimType)
                        Console.WriteLine("Right: {0}", claim.Right)
                        Console.WriteLine("Resource: {0}", claim.Resource)
                        Console.WriteLine()
                        returnvalue = True
                    End If
                End If
            Next claim
        Next claimset
        Return returnvalue
    
    End Function
    

TryGetIdentity yöntemini uygulamak için

  1. sınıfının bir örneğinin TryGetIdentityEndpointIdentity istemci tarafından döndürülip döndürülemeyeceğini belirleyen yöntemini uygulayın. WCF altyapısı, iletiden hizmetin kimliğini almak için önce yönteminin uygulamasını TryGetIdentity çağırır. Ardından altyapı, döndürülen EndpointIdentity ve AuthorizationContextile uygulamayı çağırırCheckAccess.

  2. yöntemine TryGetIdentity aşağıdaki kodu girin:

    public override bool TryGetIdentity(EndpointAddress reference, out EndpointIdentity identity)
    {
        return IdentityVerifier.CreateDefault().TryGetIdentity(reference, out identity);
    }
    
    Public Overrides Function TryGetIdentity(ByVal reference As EndpointAddress, _
                                             <System.Runtime.InteropServices.Out()> ByRef identity As EndpointIdentity) As Boolean
        Return IdentityVerifier.CreateDefault().TryGetIdentity(reference, identity)
    End Function
    
    

Özel bağlama uygulamak ve özel IdentityVerifier'ı ayarlamak için

  1. Nesne döndüren bir Binding yöntem oluşturun. Bu örnek, sınıfının bir örneğini WSHttpBinding oluşturur ve güvenlik modunu Messageolarak, öğesini ClientCredentialType ise olarak Noneayarlar.

  2. yöntemini kullanarak CreateBindingElements bir BindingElementCollection oluşturun.

  3. SecurityBindingElement koleksiyonundan değerini döndürür ve bir SymmetricSecurityBindingElement değişkene yayınlar.

  4. IdentityVerifier sınıfının özelliğini LocalClientSecuritySettings daha önce oluşturulan sınıfın yeni bir örneğine CustomIdentityVerifier ayarlayın.

    public static Binding CreateCustomSecurityBinding()
    {
        WSHttpBinding binding = new WSHttpBinding(SecurityMode.Message);
        //Clients are anonymous to the service.
        binding.Security.Message.ClientCredentialType = MessageCredentialType.None;
        //Secure conversation is turned off for simplification. If secure conversation is turned on, then
        //you also need to set the IdentityVerifier on the secureconversation bootstrap binding.
        binding.Security.Message.EstablishSecurityContext = false;
    
        // Get the SecurityBindingElement and cast to a SymmetricSecurityBindingElement to set the IdentityVerifier.
        BindingElementCollection outputBec = binding.CreateBindingElements();
        SymmetricSecurityBindingElement ssbe = (SymmetricSecurityBindingElement)outputBec.Find<SecurityBindingElement>();
    
        //Set the Custom IdentityVerifier.
        ssbe.LocalClientSettings.IdentityVerifier = new CustomIdentityVerifier();
    
        return new CustomBinding(outputBec);
    }
    
    Public Shared Function CreateCustomSecurityBinding() As Binding
        Dim binding As New WSHttpBinding(SecurityMode.Message)
    
        With binding.Security.Message
            'Clients are anonymous to the service.
            .ClientCredentialType = MessageCredentialType.None
            'Secure conversation is turned off for simplification. If secure conversation is turned on, then 
            'you also need to set the IdentityVerifier on the secureconversation bootstrap binding.
            .EstablishSecurityContext = False
        End With
        ' Get the SecurityBindingElement and cast to a SymmetricSecurityBindingElement to set the IdentityVerifier.
        Dim outputBec = binding.CreateBindingElements()
        Dim ssbe = CType(outputBec.Find(Of SecurityBindingElement)(), SymmetricSecurityBindingElement)
    
        'Set the Custom IdentityVerifier.
        ssbe.LocalClientSettings.IdentityVerifier = New CustomIdentityVerifier()
    
        Return New CustomBinding(outputBec)
    End Function
    
  5. Döndürülen özel bağlama, istemci ve sınıfın bir örneğini oluşturmak için kullanılır. İstemci daha sonra aşağıdaki kodda gösterildiği gibi hizmetin özel kimlik doğrulama denetimini gerçekleştirebilir.

    using (CalculatorClient client = new CalculatorClient(customSecurityBinding, serviceAddress))
    {
    
    Using client As New CalculatorClient(customSecurityBinding, serviceAddress)
    

Örnek 1

Aşağıdaki örnekte sınıfının eksiksiz bir uygulaması gösterilmektedir IdentityVerifier .

class CustomIdentityVerifier : IdentityVerifier
{
    public override bool CheckAccess(EndpointIdentity identity, AuthorizationContext authContext)
    {
        bool returnvalue = false;

        foreach (ClaimSet claimset in authContext.ClaimSets)
        {
            foreach (Claim claim in claimset)
            {
                if (claim.ClaimType == "http://schemas.microsoft.com/ws/2005/05/identity/claims/x500distinguishedname")
                {
                    X500DistinguishedName name = (X500DistinguishedName)claim.Resource;
                    if (name.Name.Contains(((OrgEndpointIdentity)identity).OrganizationClaim))
                    {
                        Console.WriteLine("Claim Type: {0}", claim.ClaimType);
                        Console.WriteLine("Right: {0}", claim.Right);
                        Console.WriteLine("Resource: {0}", claim.Resource);
                        Console.WriteLine();
                        returnvalue = true;
                    }
                }
            }
        }
        return returnvalue;
    }

    public override bool TryGetIdentity(EndpointAddress reference, out EndpointIdentity identity)
    {
        return IdentityVerifier.CreateDefault().TryGetIdentity(reference, out identity);
    }
}
Friend Class CustomIdentityVerifier
    Inherits IdentityVerifier

    Public Overrides Function CheckAccess(ByVal identity As EndpointIdentity, _
                                          ByVal authContext As AuthorizationContext) As Boolean

        Dim returnvalue = False
        For Each claimset In authContext.ClaimSets
            For Each claim In claimset
                If claim.ClaimType = "http://schemas.microsoft.com/ws/2005/05/identity/claims/x500distinguishedname" Then
                    Dim name = CType(claim.Resource, X500DistinguishedName)
                    If name.Name.Contains((CType(identity, OrgEndpointIdentity)).OrganizationClaim) Then
                        Console.WriteLine("Claim Type: {0}", claim.ClaimType)
                        Console.WriteLine("Right: {0}", claim.Right)
                        Console.WriteLine("Resource: {0}", claim.Resource)
                        Console.WriteLine()
                        returnvalue = True
                    End If
                End If
            Next claim
        Next claimset
        Return returnvalue

    End Function

    Public Overrides Function TryGetIdentity(ByVal reference As EndpointAddress, _
                                             <System.Runtime.InteropServices.Out()> ByRef identity As EndpointIdentity) As Boolean
        Return IdentityVerifier.CreateDefault().TryGetIdentity(reference, identity)
    End Function

End Class

Örnek 2

Aşağıdaki örnekte sınıfının eksiksiz bir uygulaması gösterilmektedir EndpointIdentity .

public class OrgEndpointIdentity : EndpointIdentity
{
    private string orgClaim;
    public OrgEndpointIdentity(string orgName)
    {
        orgClaim = orgName;
    }

    public string OrganizationClaim
    {
        get { return orgClaim; }
        set { orgClaim = value; }
    }
}
Public Class OrgEndpointIdentity
    Inherits EndpointIdentity
    Private orgClaim As String

    Public Sub New(ByVal orgName As String)
        orgClaim = orgName
    End Sub

    Public Property OrganizationClaim() As String
        Get
            Return orgClaim
        End Get
        Set(ByVal value As String)
            orgClaim = value
        End Set
    End Property
End Class

Ayrıca bkz.