Vorgehensweise: Ansprüche vergleichen
Die Identitätsmodellinfrastruktur in Windows Communication Foundation (WCF) wird verwendet, um die Autorisierungsüberprüfung auszuführen. 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. In diesem Thema wird beschrieben, wie Sie Ansprüche vergleichen, einschließlich integrierten und benutzerdefinierten Anspruchstypen. Weitere Informationen über die Identitätsmodellinfrastruktur finden Sie unter Verwalten von Ansprüchen und Autorisierung mit dem Identitätsmodell.
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. Weitere Informationen finden Sie im folgenden Beispiel.
Dim c1 As Claim = Claim.CreateNameClaim("someone")
Dim c2 As Claim = Claim.CreateNameClaim("someone")
Claim c1 = Claim.CreateNameClaim("someone");
Claim c2 = Claim.CreateNameClaim("someone");
Beide Ansprüche haben den Anspruchstyp Name, das Recht PossessProperty und eine Ressource der Zeichenfolge "someone". Da alle drei Teile des Anspruchs gleich sind, sind die Ansprüche identisch.
Die integrierten Anspruchstypen werden mit der Equals-Methode verglichen. Anspruchsspezifischer Vergleichscode wird verwendet, falls erforderlich. Es liegen z. B. die folgenden zwei Benutzerprinzipalnamen (UPN)-Ansprüche vor:
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");
Der Vergleichscode in der Equals-Methode gibt true zurück und nimmt an, dass example\someone
denselben Domänenbenutzer identifiziert wie "someone@example.com".
Benutzerdefinierte Anspruchstypen können auch mit der Equals-Methode verglichen werden. 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. 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.
Vergleichen von integrierten Ansprüchen
Wenn zwei Instanzen der Claim-Klasse vorliegen, verwenden Sie Equals für den Vergleich, wie im folgenden Code gezeigt.
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); }
Vergleichen von benutzerdefinierten Ansprüchen mit primitiven Ressourcentypen
Für benutzerdefinierte Ansprüche mit primitiven Ressourcentypen kann der Vergleich wie für integrierte Ansprüche erfolgen, wie im folgenden Code veranschaulicht.
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); }
Für benutzerdefinierte Ansprüche mit struktur- oder klassenbasierten Typen überschreibt der Ressourcentyp die Equals-Methode.
Überprüfen Sie zunächst, ob der obj-Parameter NULL ist, und wenn ja, geben Sie false zurück.
If obj Is Nothing Then Return False
if (obj == null) return false;
Rufen Sie als nächstes ReferenceEquals auf, und übergeben Sie this und obj als Parameter. Wenn true zurückgegeben wird, geben Sie true zurück.
If ReferenceEquals(Me, obj) Then Return True
if (ReferenceEquals(this, obj)) return true;
Versuchen Sie danach, obj einer lokalen Variable des Klassentyps zuzuweisen. Wenn dieser Versuch fehlschlägt, lautet die Referenz NULL. In derartigen Fällen wird false zurückgegeben.
Führen Sie den benutzerdefinierten Vergleich durch, der notwendig ist, um den aktuellen Anspruch ordnungsgemäß mit dem bereitgestellten Anspruch zu vergleichen.
Beispiel
Das folgende Beispiel zeigt einen Vergleich von benutzerdefinierten Ansprüchen, deren Anspruchsressource ein nicht primitiver Typ ist.
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");
}
}
}
Siehe auch
Aufgaben
Vorgehensweise: Erstellen eines benutzerdefinierten Anspruchs
Konzepte
Verwalten von Ansprüchen und Autorisierung mit dem Identitätsmodell