다음을 통해 공유


방법: 클레임 비교

WCF(Windows Communication Foundation)의 ID 모델 인프라는 권한 부여 확인을 수행하는 데 사용됩니다. 따라서 이 인프라의 일반적인 작업은 권한 부여 컨텍스트의 클레임과 요청한 작업을 수행하거나 요청한 리소스에 액세스하는 데 필요한 클레임을 비교하는 것입니다. 이 항목에서는 기본 제공 클레임 형식 및 사용자 지정 클레임 형식을 비롯한 클레임의 비교 방법에 대해 설명합니다. ID 모델 인프라에 대한 자세한 내용은 ID 모델을 사용하여 클레임 및 권한 부여 관리를 참조하십시오.

클레임 비교 작업에는 클레임의 세 부분(형식, 권한 및 리소스)을 다른 클레임의 해당 부분과 같은지 비교하는 작업이 포함됩니다. 다음 예제를 참조하십시오.

Dim c1 As Claim = Claim.CreateNameClaim("someone")
Dim c2 As Claim = Claim.CreateNameClaim("someone")
Claim c1 = Claim.CreateNameClaim("someone");
Claim c2 = Claim.CreateNameClaim("someone");

두 클레임에는 모두 Name 클레임 형식, PossessProperty 권한 및 "someone" 문자열 리소스가 사용됩니다. 클레임의 세 부분이 모두 같기 때문에 클레임 자체가 동일합니다.

기본 제공 클레임 형식은 Equals 메서드를 통해 비교됩니다. 클레임 관련 비교 코드는 필요한 경우에 사용됩니다. 다음은 두 개의 UPN(User Principal Name) 클레임이 주어진 예제입니다.

Dim c1 As Claim = Claim.CreateUpnClaim("someone@example.com")
Dim c2 As Claim = Claim.CreateUpnClaim("example\someone")
Claim c1 = Claim.CreateUpnClaim("someone@example.com");
Claim c2 = Claim.CreateUpnClaim("example\\someone");

이 경우, Equals 메서드의 비교 코드에서 true를 반환하여, example\someone에서 "someone@example.com"을 동일한 도메인 사용자로 식별한 것으로 간주합니다.

사용자 지정 클레임 형식도 Equals 메서드를 통해 비교할 수 있습니다. 하지만 클레임의 Resource 속성에 의해 반환된 형식이 기본 형식이 아닌 경우에는 Resource 속성에 의해 반환된 값이 Equals 메서드별로 같을 경우에만 Equals에서 true를 반환합니다. 이러한 사항이 적합하지 않은 경우 필요한 사용자 지정 처리 작업을 수행하려면 Resource 속성에 의해 반환된 사용자 지정 형식을 통해 EqualsGetHashCode 메서드를 재정의해야 합니다.

기본 제공 클레임 비교

  1. Claim 클래스의 두 인스턴스를 고려하여, 다음 코드에서와 같이 Equals를 사용하여 비교 작업을 수행합니다.

    Public Function CompareTwoClaims(ByVal c1 As Claim, ByVal c2 As Claim) As Boolean 
        Return c1.Equals(c2)        
    End Function 
    
    public bool CompareTwoClaims(Claim c1, Claim c2)
    {
        return c1.Equals(c2);
    }
    

기본 리소스 형식을 사용하는 사용자 지정 클레임 비교

  1. 기본 리소스 형식을 사용하는 사용자 지정 클레임의 경우에는 다음 코드에서와 같이 기본 제공 클레임에 대한 비교를 수행할 수 있습니다.

    Public Function CompareTwoClaims(ByVal c1 As Claim, _
    ByVal c2 As Claim) As Boolean 
        Return c1.Equals(c2)
    
    End Function         
    
    public bool CompareTwoClaims(Claim c1, Claim c2)
    {
        return c1.Equals(c2);
    }
    
  2. 구조체 또는 클래스 기반의 리소스 형식을 사용하는 사용자 지정 클레임의 경우에는 리소스 형식에서 Equals 메서드를 재정의해야 합니다.

  3. 우선 obj 매개 변수가 null인지 확인하고 null이면 false를 반환합니다.

    If obj Is Nothing Then
        Return False
    
    if (obj == null) return false;
    
  4. 그런 다음 ReferenceEquals를 호출하고 thisobj를 매개 변수로 전달합니다. 이때 true를 반환하면 true가 반환됩니다.

    If ReferenceEquals(Me, obj) Then
        Return True
    
    if (ReferenceEquals(this, obj)) return true;
    
  5. obj를 클래스 형식의 로컬 변수에 할당합니다. 이 작업에 실패할 경우 참조는 null이 됩니다. 이러한 경우에는 false가 반환됩니다.

  6. 현재 클레임을 제공된 클레임과 올바르게 비교하는 데 필요한 사용자 지정 비교 작업을 수행합니다.

예제

다음 예제에서는 클레임 리소스 형식이 기본 형식이 아닌 경우의 사용자 지정 클레임 비교에 대해 보여 줍니다.

Imports System
Imports System.IdentityModel.Claims
Imports System.Security.Permissions

<assembly: SecurityPermission(SecurityAction.RequestMinimum, Execution := True)>
NotInheritable Public Class MyResourceType
    ' private members
    Private textValue As String
    Private numberValue As Integer
    
    
    ' Constructors
    Public Sub New() 
    
    End Sub 'New
    
    Public Sub New(ByVal textVal As String, ByVal numberValue As Integer) 
        Me.textValue = textVal
        Me.numberValue = numberValue
    
    End Sub 
    
    ' Public properties
    
    Public ReadOnly Property Text() As String 
        Get
            Return Me.textValue
        End Get
    End Property
    
    Public ReadOnly Property Number() As Integer 
        Get
            Return Me.numberValue
        End Get 
    End Property
    ' Override Object.Equals to perform a specific comparison.
    Public Overrides Function Equals(ByVal obj As [Object]) As Boolean 
        ' If the object being compared to is null then return false.
        If obj Is Nothing Then
            Return False
        End If 
        ' If the object we are being asked to compare ourselves to is us
        ' then return true.
        If ReferenceEquals(Me, obj) Then
            Return True
        End If 
        ' Try to convert the object we are being asked to compare ourselves to
        ' into an instance of MyResourceType.
        Dim rhs As MyResourceType = CType(obj, MyResourceType)

        ' If the object being compared to is not an instance of 
        ' MyResourceType then return false.
        If rhs Is Nothing Then
            Return False
        End If 
        ' Return true if members are the same as those of the object
        ' being asked to compare to; otherwise, return false.
        Return Me.textValue = rhs.textValue AndAlso Me.numberValue = rhs.numberValue
    
    End Function 
    
    Public Overrides Function GetHashCode() As Integer 
        Return Me.textValue.GetHashCode() ^ Me.numberValue.GetHashCode()
    
    End Function 
End Class 
Class Program
    
    Public Shared Sub Main() 
        ' Create two claims.
        Dim c1 As New Claim("http://example.org/claims/mycustomclaim", _
           New MyResourceType("Martin", 38), Rights.PossessProperty)
        Dim c2 As New Claim("http://example.org/claims/mycustomclaim", _
           New MyResourceType("Martin", 38), Rights.PossessProperty)
        
        ' Compare the claims.
        If c1.Equals(c2) Then
            Console.WriteLine("Claims are equal")
        Else
            Console.WriteLine("Claims are not equal")
        End If
    
    End Sub 
End Class 
using System;
using System.IdentityModel.Claims;
using System.Security.Permissions;
[assembly: SecurityPermission(
   SecurityAction.RequestMinimum, Execution = true)]
namespace Samples
{
    public sealed class MyResourceType
    {
        // private members
        private string text;
        private int number;

        // Constructors
        public MyResourceType()
        {
        }

        public MyResourceType(string text, int number)
        {
            this.text = text;
            this.number = number;
        }

        // Public properties
        public string Text { get { return this.text; } }
        public int Number { get { return this.number; } }

        // Override Object.Equals to perform specfic comparison
        public override bool Equals(Object obj)
        {
            // If the object we're being asked to compare ourselves to is null
            // then return false
            if (obj == null)
                return false;

            // If the object we're being asked to compare ourselves to is us
            // then return true
            if (ReferenceEquals(this, obj))
                return true;

            // Try to convert the object we're being asked to compare ourselves to
            // into an instance of MyResourceType
            MyResourceType rhs = obj as MyResourceType;

            // If the object we're being asked to compare ourselves to 
            // isn't an instance of MyResourceType then return false
            if (rhs == null)
                return false;

            // Return true if our members are the same as those of the object
            // we're being asked to compare ourselves to. Otherwise return false
            return (this.text == rhs.text && this.number == rhs.number);
        }

        public override int GetHashCode()
        {
            return (this.text.GetHashCode() ^ this.number.GetHashCode());
        }
    }

    class Program
    {
        public static void Main()
        {
            // Create two claims
            Claim c1 = new Claim("http://example.org/claims/mycustomclaim",
                new MyResourceType("Martin", 38), Rights.PossessProperty);
            Claim c2 = new Claim("http://example.org/claims/mycustomclaim",
                new MyResourceType("Martin", 38), Rights.PossessProperty);

            // Compare the claims
            if (c1.Equals(c2))
                Console.WriteLine("Claims are equal");
            else
                Console.WriteLine("Claims are not equal");
        }
    }
}

참고 항목

작업

방법: 사용자 지정 클레임 만들기

개념

ID 모델을 사용하여 클레임 및 권한 부여 관리