Share via


Cara: Membandingkan Klaim

Infrastruktur Model Identitas di Windows Communication Foundation (WCF) digunakan untuk menjalankan pemeriksaan otorisasi. Dengan begitu, tugas umum adalah membandingkan klaim dalam konteks otorisasi dengan klaim yang diperlukan untuk menjalankan tindakan yang diminta atau mengakses sumber daya yang diminta. Topik ini menjelaskan cara membandingkan klaim, termasuk jenis klaim bawaan dan kustom. Untuk informasi selengkapnya tentang infrastruktur Model Identitas, lihat Mengelola Klaim dan Otorisasi dengan Model Identitas.

Perbandingan klaim melibatkan pembandingan tiga bagian klaim (jenis, hak, dan sumber daya) terhadap bagian yang sama dalam klaim lain untuk melihat apakah sama. Lihat contoh berikut.

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

Kedua klaim memiliki jenis klaim Name, hak PossessProperty, dan sumber daya string "someone". Karena ketiga bagian dari klaim itu sama, maka klaim itu sendiri sama.

Jenis klaim bawaan dibandingkan menggunakan metode Equals. Kode perbandingan khusus klaim digunakan jika perlu. Misalnya, mengingat dua klaim nama prinsipal pengguna (UPN) berikut, kode perbandingan dalam Equals metode mengembalikan true, dengan asumsi mengidentifikasi pengguna domain yang sama dengan someone@example.com.example\someone

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

Jenis klaim kustom juga dapat dibandingkan menggunakan metode Equals. Namun, dalam kasus ketika jenis yang ditampilkan oleh properti Resource klaim adalah sesuatu selain jenis primitif, Equals akan menampilkan true hanya jika nilai yang ditampilkan oleh properti Resource sama berdasarkan metode Equals. Dalam kasus ketika ini tidak sesuai, jenis kustom yang ditampilkan oleh properti Resource harus mengambil alih metode Equals dan GetHashCode untuk menjalankan pemrosesan kustom apa pun yang diperlukan.

Membandingkan klaim bawaan

  1. Dengan dua instans kelas Claim, gunakan Equals untuk membuat perbandingan, seperti yang ditunjukkan dalam kode berikut.

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

Membandingkan klaim kustom dengan jenis sumber daya primitif

  1. Untuk klaim kustom dengan jenis sumber daya primitif, perbandingan dapat dijalankan seperti untuk klaim bawaan, yang ditunjukkan pada kode berikut.

    public bool CompareTwoClaims(Claim c1, Claim c2)
    {
        return c1.Equals(c2);
    }
    
    Public Function CompareTwoClaims(ByVal c1 As Claim, _
    ByVal c2 As Claim) As Boolean
        Return c1.Equals(c2)
    
    End Function
    
  2. Untuk klaim kustom dengan jenis sumber daya berbasis struktur atau kelas, jenis sumber daya harus mengambil alih metode Equals.

  3. Pertama periksa apakah parameter obj adalah null, dan jika demikian, tampilkan false.

    if (obj == null) return false;
    
    If obj Is Nothing Then
        Return False
    
  4. Selanjutnya panggil ReferenceEquals dan teruskan this serta obj sebagai parameter. Jika true ditampilkan, maka tampilkan true.

    if (ReferenceEquals(this, obj)) return true;
    
    If ReferenceEquals(Me, obj) Then
        Return True
    
  5. Upaya berikutnya adalah menetapkan obj ke variabel lokal dari jenis kelas. Jika ini gagal, referensinya adalah null. Dalam kasus seperti itu, tampilkan false.

  6. Jalankan perbandingan kustom yang diperlukan untuk membandingkan klaim saat ini dengan klaim yang disediakan dengan benar.

Contoh

Contoh berikut menunjukkan perbandingan klaim kustom di mana sumber daya klaim adalah jenis non-primitif.

using System;
using System.IdentityModel.Claims;

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 specific 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");
        }
    }
}
Imports System.IdentityModel.Claims
Imports System.Security.Permissions

NotInheritable Public Class MyResourceType
    ' private members
    Private textValue As String
    Private numberValue As Integer


    ' Constructors
    Public Sub New()

    End Sub

    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

Lihat juga