8

Ich habe eine kleine Web-API-Anwendung, die Identity verwendet, um Benutzer mit Owin Bearer Tokens zu verwalten. Die Grundlagen dieser Implementierung funktionieren gut: Ich kann einen Benutzer registrieren, einen Benutzer anmelden und auf Web-API-Endpunkte zugreifen, die mit [Authorize] markiert sind.Identität Autorisieren Attribut Rollen mit Web-API

Mein nächster Schritt besteht darin, Web-API-Endpunkte mit Rollen zu begrenzen. Beispiel: Ein Controller, auf den nur Benutzer in der Administratorrolle zugreifen können. Ich habe den Admin-Benutzer wie folgt erstellt und füge sie der Administratorrolle hinzu. Wenn ich jedoch meine vorhandenen Controller von [Authorize] auf [Authorize(Roles = "Admin")] aktualisiere und versuche, über den Adim-Account darauf zuzugreifen, bekomme ich eine 401 Unauthorized.

//Seed on Startup 
    public static void Seed() 
    { 
     var user = await userManager.FindAsync("Admin", "123456"); 
     if (user == null) 
     { 
      IdentityUser user = new IdentityUser { UserName = "Admin" }; 
      var createResult = await userManager.CreateAsync(user, "123456"); 

      if (!roleManager.RoleExists("Admin")) 
       var createRoleResult = roleManager.Create(new IdentityRole("Admin")); 

      user = await userManager.FindAsync("Admin", "123456"); 
      var addRoleResult = await userManager.AddToRoleAsync(user.Id, "Admin"); 
     } 
    } 


    //Works 
    [Authorize] 
    public class TestController : ApiController 
    { 
     // GET api/<controller> 
     public bool Get() 
     { 
      return true; 
     } 
    } 

    //Doesn't work 
    [Authorize(Roles = "Admin")] 
    public class TestController : ApiController 
    { 
     // GET api/<controller> 
     public bool Get() 
     { 
      return true; 
     } 
    } 

F: Was ist der richtige Weg Rollen einzurichten ist und zu nutzen?


+0

Haben Sie die Role-Tabelle für die neu erstellte Rolle "Admin" und die UserRole-Tabelle für den korrekten Benutzer mit der Admin-Rolle überprüft? Verwenden Sie Identity Framework 2.0 oder höher? – DSR

Antwort

10

Wie stellen Sie die Ansprüche für die Benutzer, wenn sie anmelden Ich glaube, Sie diese Codezeile in der Methode GrantResourceOwnerCredentials

var identity = new ClaimsIdentity(context.Options.AuthenticationType); 
identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName)); 
identity.AddClaim(new Claim(ClaimTypes.Role, "Admin")); 
identity.AddClaim(new Claim(ClaimTypes.Role, "Supervisor")); 

fehlen, und wenn Sie möchten, um die Identität von DB Nutzung erstellen die folgenden:

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager, string authenticationType) 
    { 
     // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
     var userIdentity = await manager.CreateIdentityAsync(this, authenticationType); 
     // Add custom user claims here 
     return userIdentity; 
    } 

Dann in GrantResourceOwnerCredentials tun die folgenden:

ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, OAuthDefaults.AuthenticationType); 
+0

Das funktioniert, aber ich bin mir nicht sicher, warum ich verstehe. Muss ich das mit 'userManager.AddToRoleAsync' kombinieren? Muss ich im Grant nur Ansprüche an eine Identität zuweisen, wenn der Benutzer dieser Rolle angehört? Wenn Sie mich auf eine Dokumentation hinweisen könnten, würde ich das sehr schätzen. Vielen Dank! –

+1

Die Antwort wurde aktualisiert, bitte überprüfen Sie sie. –

+2

Ich bin neu in den Claims Tokens, aber für mich sieht es so aus, als ob alle vom Server empfangenen Token die Admin- und Supervisor-Rolle zugewiesen haben. Sollten die Rollen für die Identität nicht dynamisch von den Rollen dieses Benutzers abgerufen werden? – Mohag519

Verwandte Themen