Gör så här: Jämför anspråk
Identity Model-infrastrukturen i Windows Communication Foundation (WCF) används för att utföra auktoriseringskontroll. Därför är en vanlig uppgift att jämföra anspråk i auktoriseringskontexten med de anspråk som krävs för att utföra den begärda åtgärden eller komma åt den begärda resursen. I det här avsnittet beskrivs hur du jämför anspråk, inklusive inbyggda och anpassade anspråkstyper. Mer information om infrastrukturen för identitetsmodeller finns i Hantera anspråk och auktorisering med identitetsmodellen.
Anspråksjämförelse innebär att jämföra de tre delarna av ett anspråk (typ, rättighet och resurs) med samma delar i ett annat anspråk för att se om de är lika. Se följande exempel.
Claim c1 = Claim.CreateNameClaim("someone");
Claim c2 = Claim.CreateNameClaim("someone");
Dim c1 As Claim = Claim.CreateNameClaim("someone")
Dim c2 As Claim = Claim.CreateNameClaim("someone")
Båda anspråken har anspråkstypen Name, en rättighet för PossessPropertyoch en resurs i strängen "någon". Eftersom alla tre delarna av anspråket är lika är anspråken i sig lika.
De inbyggda anspråkstyperna jämförs med metoden Equals . Anspråksspecifik jämförelsekod används vid behov. Med tanke på följande två UPN-anspråk (User Principal Name) returnerar jämförelsekoden i Equals metoden , förutsatt att example\someone
identifierar samma domänanvändare som 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")
Anpassade anspråkstyper kan också jämföras med metoden Equals . Men i de fall då den typ som returneras av Resource egenskapen för anspråket är något annat än en primitiv typ returneras Equalstrue
endast om värdena som returneras av Resource
egenskaperna är lika med Equals metoden. Om detta inte är lämpligt bör den anpassade typ som returneras av Resource
egenskapen åsidosätta Equals metoderna och GetHashCode för att utföra den anpassade bearbetningen.
Jämföra inbyggda anspråk
Med två instanser av Claim klassen använder du Equals för att göra jämförelsen, som du ser i följande kod.
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
Jämföra anpassade anspråk med primitiva resurstyper
För anpassade anspråk med primitiva resurstyper kan jämförelse utföras som för inbyggda anspråk, som du ser i följande kod.
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
För anpassade anspråk med struktur- eller klassbaserade resurstyper bör resurstypen åsidosätta Equals metoden.
Kontrollera först om parametern
obj
ärnull
, och i så fall returnera .false
if (obj == null) return false;
If obj Is Nothing Then Return False
Nästa anrop ReferenceEquals och pass
this
ochobj
som parametrar. Om den returnerar returnerartrue
dutrue
.if (ReferenceEquals(this, obj)) return true;
If ReferenceEquals(Me, obj) Then Return True
Nästa försök att tilldela
obj
till en lokal variabel av klasstypen. Om detta misslyckas ärnull
referensen . I sådana fall returnerar dufalse
.Utför den anpassade jämförelse som krävs för att korrekt jämföra det aktuella anspråket med det angivna anspråket.
Exempel
I följande exempel visas en jämförelse av anpassade anspråk där anspråksresursen är en icke-primitiv typ.
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