13

Ich verstehe, dass ich Ansprüche können Aussagen über einen Benutzer zu machen:ASP.NET Identität „rollenbasierte“ Forderungen

var claims = new List<Claim>(); 
claims.Add(new Claim(ClaimTypes.Name, "Peter")); 
claims.Add(new Claim(ClaimTypes.Email, "[email protected]")); 

Aber wie soll ich speichern „rollenbasierte“ Ansprüche? Zum Beispiel:

Der Benutzer ist ein Super-Administrator.

claims.Add(new Claim("IsSuperAdmin, "true")); 

Der Wert der Parameter "true" fühlt sich vollständig redundant. Wie sonst kann diese Aussage mit Ansprüchen ausgedrückt werden?

Antwort

20

Das bereits für Sie durch den Rahmen durchgeführt wird. Wenn der Benutzer angemeldet ist, werden alle Benutzerrollen als Ansprüche mit dem Anspruchstyp ClaimTypes.Role hinzugefügt, und Werte sind der Rollenname.

Und wenn Sie IPrincipal.IsInRole("SuperAdmin") ausführen, überprüft das Framework tatsächlich, ob der Anspruch mit dem Typ und dem Wert SuperAdmin auf dem Benutzer vorhanden ist.

Also nichts Besonderes tun müssen. Fügen Sie einfach einen Benutzer zu einer Rolle hinzu.

+0

Welche Beziehung besteht zwischen Ansprüchen vom Typ Role und der AspNetRoles-Tabelle? – mayu

+0

@Tymski 'AspNetRoles' enthält eine Liste von Rollen. Wenn sich ein Benutzer anmeldet, werden all diese Rollen dem Cookie als Ansprüche vom Typ ClaimTypes.Role hinzugefügt. Ansprüche in Cookies sind von kurzer Dauer. Datensätze in der Datenbank werden nur in den Cookie kopiert. – trailmax

+0

Ich sollte darauf hinweisen, dass 'IPrincipal.IsInRole (" xx ")' nicht unbedingt 'ClaimTypes.Role' verwendet, wenn nach einem übereinstimmenden Anspruch gesucht wird. Zum Beispiel verwendet das 'WindowsPrincipal', das Sie nach der Windows-Authentifizierung erhalten, tatsächlich die' ClaimTypes.GroupSid' zum Angeben von Rollen. Verwenden Sie stattdessen die Eigenschaft ClaimsIdentity.RoleClaimType. – Rob

11

können Sie Rollen speichern die Claimtype mit Role

claims.Add(new Claim(ClaimTypes.Role, "SuperAdmin")); 
+1

Ich habe den obigen Kommentar gemacht, aber es gilt auch hier: Es wäre zuverlässiger, die 'ClaimsIdentity.RoleClaimType' Eigenschaft beim Hinzufügen von Rollen zu verwenden. – Rob

+0

Was ist mit mehr als einer Rolle? –

+0

Komma getrennt? Mehrere Ansprüche mit demselben Typ? Andere? –

1

Sie müssen die Rolle in einem Anspruch mit einem ClaimType.Role-Typ angeben und dann den Anspruchstyp angeben, der die Rolle in der ClaimsIdentity enthält, wie unten dargestellt.

var claimsIdentity = new ClaimsIdentity(new[] 
{ 
    new Claim(ClaimTypes.Email, "[email protected]"), 
    new Claim(ClaimTypes.Name, "Peter"), 
    new Claim(ClaimTypes.Role, "SuperAdmin"), 
}, 
"ApplicationCookie", ClaimTypes.Email, ClaimTypes.Role); 

Dies wird dann können Sie das [Authorize(Roles = "SuperAdmin")] Attribut in Ihrem Controller verwenden.

Verwandte Themen