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
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
Ihr Code funktioniert. Das Flag "IsAdmin" wird jetzt auf "True" gesetzt. – Ciwan
@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