Delen via


Procedure: Claims vergelijken

De infrastructuur voor identiteitsmodellen in Windows Communication Foundation (WCF) wordt gebruikt om autorisatiecontrole uit te voeren. Een veelvoorkomende taak is om claims in de autorisatiecontext te vergelijken met de claims die nodig zijn om de aangevraagde actie uit te voeren of toegang te krijgen tot de aangevraagde resource. In dit onderwerp wordt beschreven hoe u claims vergelijkt, waaronder ingebouwde en aangepaste claimtypen. Zie Claims en autorisatie beheren met het identiteitsmodel voor meer informatie over de infrastructuur voor identiteitsmodellen.

Claimvergelijking omvat het vergelijken van de drie onderdelen van een claim (type, recht en resource) ten opzichte van dezelfde onderdelen in een andere claim om te zien of ze gelijk zijn. Zie het volgende voorbeeld.

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

Beide claims hebben een claimtype Name, een recht van PossessPropertyen een resource van de tekenreeks 'iemand'. Omdat alle drie de onderdelen van de claim gelijk zijn, zijn de claims zelf gelijk.

De ingebouwde claimtypen worden vergeleken met behulp van de Equals methode. Claimspecifieke vergelijkingscode wordt indien nodig gebruikt. Als u bijvoorbeeld de volgende twee UPN-claims (User Principal Name) opgeeft, retourneert de vergelijkingscode in de Equals methode, ervan uitgaande dat example\someone dezelfde domeingebruiker wordt geïdentificeerd als someone@example.com.true

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")

Aangepaste claimtypen kunnen ook worden vergeleken met behulp van de Equals methode. In gevallen waarin het type dat wordt geretourneerd door de Resource eigenschap van de claim echter iets anders is dan een primitief type, wordt true alleen Equals geretourneerd als de waarden die door de Resource eigenschappen worden geretourneerd, gelijk zijn aan de Equals methode. In gevallen waarin dit niet van toepassing is, moet het aangepaste type dat door de Resource eigenschap wordt geretourneerd, de Equals en GetHashCode methoden negeren om de aangepaste verwerkingen uit te voeren die nodig zijn.

Ingebouwde claims vergelijken

  1. Gebruik bij twee exemplaren van de Claim klasse de Equals vergelijking, zoals wordt weergegeven in de volgende code.

    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
    

Aangepaste claims vergelijken met primitieve resourcetypen

  1. Voor aangepaste claims met primitieve resourcetypen kan een vergelijking worden uitgevoerd als voor ingebouwde claims, zoals wordt weergegeven in de volgende code.

    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. Voor aangepaste claims met resourcetypen op basis van een structuur of klasse moet het resourcetype de Equals methode overschrijven.

  3. Controleer eerst of de obj parameter is null, en zo ja, retourneer false.

    if (obj == null) return false;
    
    If obj Is Nothing Then
        Return False
    
  4. Volgende aanroep ReferenceEquals en doorgeven this en obj als parameters. Als het retourneert, keert trueu terug true.

    if (ReferenceEquals(this, obj)) return true;
    
    If ReferenceEquals(Me, obj) Then
        Return True
    
  5. Probeer vervolgens toe te wijzen aan obj een lokale variabele van het klassetype. Als dit mislukt, is nullde verwijzing . In dergelijke gevallen retourneert falseu .

  6. Voer de aangepaste vergelijking uit die nodig is om de huidige claim correct te vergelijken met de opgegeven claim.

Opmerking

In het volgende voorbeeld ziet u een vergelijking van aangepaste claims waarbij de claimresource een niet-primitief type is.

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

Zie ook