2017-08-15 1 views
0

hat ich auf einem .Net-Core API arbeitete, und in meinem Controller Ich habe den folgenden Code:In JWT Authorization, ob Benutzerrolle Admin

if (User.Identity.IsAuthenticated) 
{ 
    var username = HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier); 
    var user = await _userManager.FindByNameAsync(username); 
    artistCardDtoCollection = _artistsService.GetAllArtists(user.Id, User.IsInRole("Admin")); 
} 

Der obige Code ist, weil ich weitergeben will die User.Id (wenn angemeldet) und eine IsAdmin Flagge zu meiner GetAllArtists Methode.

Der obige Code schlägt auf User.IsInRole("Admin") fehl. Ich bekomme eine false, wenn ich 100% weiß, dass der betreffende Benutzer ein Admin ist. Ich habe doppelt überprüft die Datenbank über SQL Management Studio.

Das lässt mich denken, dass man User.IsInRole() nicht verwenden kann, wenn man mit JWT arbeitet. Wenn das der Fall ist, was ist dann der richtige Weg? Dank

Antwort

1

Wahrscheinlich könnte es das Caching Problem mit User.IsInRole(), wenn wir documentation überprüfen wir finden:

IsInRole erste prüft die IsRoleListCached Eigenschaft , um zu bestimmen, ob eine zwischengespeicherte Liste von Rollennamen für Der aktuelle Benutzer ist verfügbar. Wenn die IsRoleListCached-Eigenschaft wahr ist, wird die zwischengespeicherte Liste für die angegebene Rolle auf überprüft. Wenn die IsInRole-Methode die angegebene -Rolle in der zwischengespeicherten Liste findet, wird True zurückgegeben. Wenn IsInRole die angegebene Rolle nicht findet, ruft sie die GetRolesForUser-Methode der standardmäßigen Provider-Instanz auf, um zu ermitteln, ob der Benutzername mit einer Rolle aus der Datenquelle für den konfigurierten ApplicationName -Wert verknüpft ist.

In Ihrem Fall können Sie versuchen, GetRolesAsync wie unten zu verwenden:

var user = await _userManager.FindByNameAsync(username); 
var roles = await _userManager.GetRolesAsync(user); 
artistCardDtoCollection = _artistsService.GetAllArtists(user.Id, roles.Contains("Admin")); 
+0

Würden beide '_userManager.FindByNameAsync (username);' und '_userManager.GetRolesAsync (Benutzer);' einen Aufruf an das machen Datenbank? also zwei Anrufe zum Db. Wird der Cache auch nicht gelöscht, wenn ich die Anwendung stoppe und starte? – Ciwan

+0

Ihr Code funktioniert. Das Flag "IsAdmin" wird jetzt auf "True" gesetzt. – Ciwan

+1

@Ciwan Ja, 2 Abfragen. Um den Rollennamen über 1 Abfrage zu erhalten, sollten wir 2 Joins machen, 1. um Rollen zu bekommen und 2. um Rollenname nach ID zu bekommen. Und hier haben wir 1 einfache Abfrage für Benutzer und 1 mit 1 Join für RoleName, also sollte es in der Zeit fast gleich sein (ich habe es gemessen). 'GetRolesAsync' generiert das nächste SQL:' SELECT [role]. [Name] FROM [AspNetUserRoles] AS [BenutzerRole] INNER JOIN [AspNetRoles] AS [Rolle] ON [BenutzerRolle]. [RoleId] = [Rolle]. [Id ] WHERE [userRole]. [UserId] = @ userId', so können Sie einfach 'new ApplicationUser {id = userid}' mit nur ID übergeben, nicht das ganze User-Objekt und es hat für mich gut funktioniert. – user2771704

Verwandte Themen