Vorgehensweise: Ansprüche vergleichenHow to: Compare Claims

Die identitätsmodellinfrastruktur in Windows Communication Foundation (WCF) wird verwendet, um die autorisierungsüberprüfung auszuführen.The Identity Model infrastructure in Windows Communication Foundation (WCF) is used to perform authorization checking. Eine gängige Aufgabe besteht darin, die Ansprüche im Autorisierungskontext mit den Ansprüchen zu vergleichen, die erforderlich sind, um die angeforderte Aktion auszuführen oder auf die angeforderte Ressource zuzugreifen.As such, a common task is to compare claims in the authorization context to the claims required to perform the requested action or access the requested resource. In diesem Thema wird beschrieben, wie Ansprüche verglichen werden, einschließlich integrierter und benutzerdefinierter Anspruchstypen.This topic describes how to compare claims, including built-in and custom claim types. Weitere Informationen über die identitätsmodellinfrastruktur finden Sie unter Verwalten von Ansprüchen und Autorisierung mit dem Identitätsmodell.For more information about the Identity Model infrastructure, see Managing Claims and Authorization with the Identity Model.

Der Vergleich von Ansprüchen umfasst das Vergleichen der drei Bestandteile des Anspruchs (Typ, Recht und Ressource) mit den entsprechenden Teilen eines anderen Anspruchs, um festzustellen, ob sie identisch sind.Claim comparison involves comparing the three parts of a claim (type, right, and resource) against the same parts in another claim to see if they are equal. Weitere Informationen finden Sie im folgenden Beispiel.See the following example.

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 Ansprüche haben den Anspruchstyp Name, das Recht PossessProperty und eine Ressource der Zeichenfolge "someone".Both claims have a claim type of Name, a right of PossessProperty, and a resource of the string "someone". Da alle drei Teile des Anspruchs gleich sind, sind die Ansprüche identisch.As all three parts of the claim are equal, the claims themselves are equal.

Die integrierten Anspruchstypen werden mit der Equals-Methode verglichen.The built-in claim types are compared using the Equals method. Anspruchsspezifischer Vergleichscode wird verwendet, falls erforderlich.Claim-specific comparison code is used where necessary. Es liegen z. B. die folgenden zwei Benutzerprinzipalnamen (UPN)-Ansprüche vor:For example, given the following two user principal name (UPN) claims:

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

der Vergleichscode in der Equals -Methode zurückkehrt truedavon ausgegangen, dass example\someone identifiziert den gleiche Domänenbenutzer als "someone@example.com".the comparison code in the Equals method returns true, assuming example\someone identifies the same domain user as "someone@example.com".

Benutzerdefinierte Anspruchstypen können auch mit der Equals-Methode verglichen werden.Custom claim types can also be compared using the Equals method. In Fällen, in denen der von der Resource-Eigenschaft des Anspruchs zurückgegebene Typ kein primitiver Typ ist, gibt Equals nur true zurück, wenn die von den Resource-Eigenschaften zurückgegebenen Werte laut der Equals-Methode identisch sind.However, in cases where the type returned by the Resource property of the claim is something other than a primitive type, the Equals returns true only if the values returned by the Resource properties are equal according to the Equals method. In Fällen, in denen dies nicht zutrifft, überschreibt der von der Resource-Eigenschaft zurückgegebene benutzerdefinierte Typ die Equals-Methode und die GetHashCode-Methode, um die erforderliche benutzerdefinierte Verarbeitung auszuführen.In cases where this is not appropriate, the custom type returned by the Resource property should override the Equals and GetHashCode methods to perform whatever custom processing is necessary.

Vergleichen von integrierten AnsprüchenComparing built-in claims

  1. Wenn zwei Instanzen der Claim-Klasse vorliegen, verwenden Sie Equals für den Vergleich, wie im folgenden Code gezeigt.Given two instances of the Claim class, use the Equals to make the comparison, as shown in the following 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 
    

Vergleichen von benutzerdefinierten Ansprüchen mit primitiven RessourcentypenComparing custom claims with primitive resource types

  1. Für benutzerdefinierte Ansprüche mit primitiven Ressourcentypen kann der Vergleich wie für integrierte Ansprüche erfolgen, wie im folgenden Code veranschaulicht.For custom claims with primitive resource types, comparison can be performed as for built-in claims, as shown in the following 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. Für benutzerdefinierte Ansprüche mit struktur- oder klassenbasierten Typen überschreibt der Ressourcentyp die Equals-Methode.For custom claims with structure or class based resource types, the resource type should override the Equals method.

  3. Überprüfen Sie zunächst, ob der obj-Parameter null ist, und wenn ja, geben Sie false zurück.First check whether the obj parameter is null, and if so, return false.

    if (obj == null) return false;
    
    If obj Is Nothing Then
        Return False
    
  4. Rufen Sie als nächstes ReferenceEquals auf, und übergeben Sie this und obj als Parameter.Next call ReferenceEquals and pass this and obj as parameters. Wenn true zurückgegeben wird, geben Sie true zurück.If it returns true, then return true.

    if (ReferenceEquals(this, obj)) return true;
    
    If ReferenceEquals(Me, obj) Then
        Return True
    
  5. Versuchen Sie danach, obj einer lokalen Variable des Klassentyps zuzuweisen.Next attempt to assign obj to a local variable of the class type. Wenn dieser Versuch fehlschlägt, lautet die Referenz null.If this fails, the reference is null. In derartigen Fällen wird false zurückgegeben.In such cases, return false.

  6. Führen Sie den benutzerdefinierten Vergleich durch, der notwendig ist, um den aktuellen Anspruch ordnungsgemäß mit dem bereitgestellten Anspruch zu vergleichen.Perform the custom comparison necessary to correctly compare the current claim to the provided claim.

BeispielExample

Das folgende Beispiel zeigt einen Vergleich von benutzerdefinierten Ansprüchen, deren Anspruchsressource ein nicht primitiver Typ ist.The following example shows a comparison of custom claims where the claim resource is a non-primitive type.

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

Siehe auchSee Also

Verwalten von Ansprüchen und Autorisierung mit dem IdentitätsmodellManaging Claims and Authorization with the Identity Model
Vorgehensweise: Erstellen eines benutzerdefinierten AnspruchsHow to: Create a Custom Claim