8

Mam małą aplikację Web API, która używa Identity do zarządzania użytkownikami przy użyciu tokenów na okaziciela Owin. Podstawy tej implementacji działają dobrze: mogę zarejestrować użytkownika, zalogować się do użytkownika i uzyskać dostęp do punktów końcowych interfejsu Web API oznaczonych jako [Authorize].Identity Authorize Attribute Roles with Web API

Następnym krokiem jest ograniczenie punktów końcowych Web API za pomocą ról. Na przykład kontroler, do którego mają dostęp tylko użytkownicy z uprawnieniami administratora. Stworzyłem użytkownika Admin, jak poniżej, i dodaję go do roli Admin. Jednak, gdy zaktualizuję istniejące kontrolery z [Authorize] na [Authorize(Roles = "Admin")] i spróbuję uzyskać do nich dostęp za pomocą konta Adim, otrzymam numer 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; 
     } 
    } 

Q: Jaki jest prawidłowy sposób skonfigurować i używać role?


+0

Czy sprawdziłeś tabelę ról dla nowo utworzonej roli "Administrator" i tabela UserRole dla właściwego użytkownika z rolą administratora? Czy korzystasz z systemu tożsamości 2.0 lub nowszego? – DSR

Odpowiedz

10

Jak ustawić roszczeń o użytkownikach, kiedy zalogować wierzę brakuje tego wiersza kodu w metodzie 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")); 

A jeśli chcesz stworzyć tożsamość z DB użytkowania poniżej:

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; 
    } 

Następnie w GrantResourceOwnerCredentials wykonaj poniżej:

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

To działa, ale nie jestem pewien, czy rozumiem dlaczego. Czy muszę połączyć to z 'userManager.AddToRoleAsync'? Czy w ramach Grantu powinienem przypisywać roszczenia do tożsamości tylko wtedy, gdy użytkownik należy do tej roli? gdybyś mógł wskazać mi jakąś dokumentację, doceniłbym to bardzo. Dzięki! –

+1

Zaktualizowano odpowiedź, sprawdź ją –

+2

Jestem nowym żetonem Roszczenia, ale dla mnie wygląda na to, że wszystkie tokeny otrzymane z serwera będą miały przypisaną rolę Administratora i opiekuna. Czy role należące do tego użytkownika powinny być dynamicznie pobierane przez jego tożsamość? – Mohag519