Comment : comparer des revendications

L'infrastructure de modèle d'identité dans Windows Communication Foundation (WCF) est utilisée pour effectuer les contrôles d'autorisation. L'une des tâches fréquentes de cette infrastructure de contrôle consiste notamment à comparer les revendications émises dans le cadre des autorisations à celles requises pour l'exécution des requêtes d'action ou des requêtes d'accès aux ressources. Cette rubrique décrit comment comparer des revendications, notamment les types de revendication intégrés et personnalisés. Pour plus d'informations sur le sujet suivant l'infrastructure de modèle d'identité, consultez Gestion des revendications et autorisation avec le modèle d'identité.

Comparer des revendications signifie comparer leurs trois composantes, à savoir leur type, leurs droits et leurs ressources avec les composantes d'autres revendications, et ce afin de savoir si elles sont égales. Lisez l'exemple suivant.

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

Ces deux revendications partagent le même type de revendication Name, les mêmes droits PossessProperty et une même ressource pour la chaîne "someone". Leurs trois composantes étant égales, ces deux revendications sont elles-mêmes égales.

Les types de revendication intégrés sont comparés à l'aide de la méthode Equals. Un code de comparaison spécifique à la revendication est utilisé lorsque nécessaire. Prenons, par exemple, les deux revendications suivantes qui utilisent un nom d'utilisateur principal (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");

Le code de comparaison de la méthode Equals retourne la valeur true car il suppose que example\someone permet d'identifier le même utilisateur de domaine que « xyz@exemple.fr ».

Les types de revendication personnalisés peuvent également être comparés à l'aide de la méthode Equals. Toutefois, si le type retourné par la propriété Resource de la revendication est un type autre que primitif, la méthode Equals retournera uniquement la valeur true si les valeurs retournées par les propriétés Resource sont égales selon la méthode Equals. Dans les cas où ce processus ne convient pas, le type personnalisé retourné par la propriété Resource doit remplacer les méthodes Equals et GetHashCode afin de permettre tous traitements personnalisés requis.

Comparaison des revendications intégrées

  1. Soit deux instances de la classe Claim, utilisez la méthode Equals pour les comparer, tel qu'illustré dans le code suivant.

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

Comparaison de revendications personnalisées dont les types de ressources sont primitifs

  1. Pour les revendications personnalisées dont les types de ressources sont primitifs, la comparaison peut s'effectuer de la même manière que dans le cadre de comparaisons intégrées, tel qu'illustré dans le code suivant.

    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. Pour les revendications personnalisées dont les types de ressources sont basés sur une structure ou une classe, le type de ressource doit être substitué à la méthode Equals.

  3. Vérifiez tout d'abord si le paramètre obj a la valeur Null. Si tel est le cas, retournez la valeur false.

    If obj Is Nothing Then
        Return False
    
    if (obj == null) return false;
    
  4. Appelez ensuite la méthode ReferenceEquals et passez this et obj en tant que paramètres. Si la méthode appelée retourne la valeur true, retournez alors la valeur true.

    If ReferenceEquals(Me, obj) Then
        Return True
    
    if (ReferenceEquals(this, obj)) return true;
    
  5. Essayez ensuite d'affecter obj à une variable locale du type de classe. En cas d'échec, la référence est Null. Dans ce cas, retournez la valeur false.

  6. Effectuez la comparaison personnalisée nécessaire pour comparer de manière adéquate la revendication en cours à la revendication spécifiée.

Exemple

L'exemple suivant illustre le cas d'une comparaison où le type de ressource des revendications personnalisées comparées n'est pas primitif.

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

Voir aussi

Tâches

Comment : créer une revendication personnalisée

Concepts

Gestion des revendications et autorisation avec le modèle d'identité