2017-02-03 4 views
7

Ich bin ein ASP.NET Core Anfänger. Ich stecke in Rollen-, Claim- und Nutzerbeziehung fest.ASP.NET Core Identität Rolle, Anspruch und Benutzer

Ich habe einen Benutzer Ben, Benutzer gehört zu Admin Rolle. Admin Rolle hat Ansprüche View-Seite und Edit-Seite in der Datenbank.

Aber ich kann nicht Ansprüche und Rollen erhalten zu diesem Benutzer gehören zu:

(Siehe Kommentar in Code)

var user = await _userManager.FindByNameAsync(applicationUser.UserName); 
if(user != null) { 
    var userClaims = await _userManager.GetClaimsAsync(user); // empty, WHY ? 
    var userRoles = await _userManager.GetRolesAsync(user); // ['admin'] 
    var adminRole = DbContext.Roles.FirstOrDefault(x => x.Name == "Admin"); 
    IList<Claim> adminClaims; 
    if(adminRole != null) 
    { 
     adminClaims = await _roleManager.GetClaimsAsync(adminRole); 
     // correct => ['view-page', 'edit-page'] 
    } 
    } 
} 

In meinem Kopf, ich verstehe, wenn ein Benutzer ein Mitglied ist von einer Rolle erbt er die Ansprüche dieser Rolle.

Standard ASP.NET Identität haben 5 Tabellen:

  • Benutzer.
  • Rollen.
  • UserRoles - Ein Benutzer kann viele Rollen haben.
  • Rollenklagen - Eine Rolle kann viele Ansprüche haben.
  • UserClaims - Ein Benutzer kann viele Ansprüche haben.

Denke ich richtig? Warum gibt userManager.GetClaimsAsync (user) leere Ansprüche zurück?

Irgendwelche Vorschläge?

Antwort

5

Warum userManager.GetClaimsAsync (Benutzer) leere Ansprüche zurückgibt?

Da UserManager.GetClaimsAsync(user) die Tabelle UserClaims abfragt. Gleich für RoleManager.GetClaimsAsync(role) fragt die RoleClaims Tabelle ab.

Aber von Entwurf in ASP.NET Identity Core, wenn ein Benutzer Mitglied einer Rolle ist, erben sie automatisch die Ansprüche der Rolle. Sie können die ClaimsPrincipal überprüfen, zum Beispiel in einer Controller-Aktion:

var claims = User.Claims.ToList(); 

Sie können den Code in UserClaimsPrincipalFactory.cs sehen, die ein ClaimsPrincipal von einem Benutzer erstellt.

+0

Ich brauche Benutzeransprüche, um JWT in der Web-API zu erstellen, wenn das Token also keine gültigen Benutzeransprüche/-rollen enthält, kann ich User.Claims nicht verwenden. Und ich denke UserManager.GetClaimsAsync (user) fragt die UserRoles-Tabelle ab, genau, es fragt die UserClaims-Tabelle ab. Haben Sie Vorschläge für diese Situation? – trinvh

+0

@trinvh "UserManager.GetClaimsAsync (Benutzer) Abfragen der UserRoles" war ein Tippfehler, korrigiert es Dank – tmg

+0

Ich markierte richtige Antwort wegen der oben genannten Link. Für jeden, der Benutzeransprüche erhalten möchte, muss createAsync-Methode angezeigt werden – trinvh

0

Ich hatte vor kurzem mit diesem Thema befassen und das Problem der Lokalisierung Benutzer durch einen bestimmten Anspruch zu lösen, die von einer Rolle kam, ist ein neues Claim-Objekt mit den Werten aus dem Rolle Anspruch zu erstellen:

var role = await roleManager.FindByNameAsync(yourRoleName); 
if(role != null) 
{ 
    var roleClaims = await roleManager.GetClaimsAsync(role); 
    if(roleClaims != null && roleClaims.Count() > 0) 
    { 
     foreach(var claim in roleClaims.ToList()) 
     { 
      var users = await userManager.GetUsersForClaimAsync(new Claim(claim.Type, claim.Value)); 
      if(users != null && users.Count() > 0) 
      { 
       foreach(var user in users.ToList()) 
       { 
        //This is an example of only removing a claim, but this is the 
        //area where you could remove/add the updated claim 
        await userManager.RemoveClaimAsync(user, new Claim(claim.Type, claim.Value)); 
       } 
      } 
     } 
    } 
} 

Dies ermöglichte mir das Aktualisieren/Löschen einer Rolle mit Ansprüchen und das Übergeben dieser Änderungen an die erneut auszugebenden/entfernten Benutzer, denen die Rollen und Ansprüche zugewiesen wurden. Ich suche jedoch immer noch nach etwas eleganterem/einfacherem mit weniger Code.

Verwandte Themen