8

Ho una piccola applicazione API Web che utilizza Identity per gestire gli utenti che utilizzano i token bearer Owin. Le basi di questa implementazione funzionano bene: posso registrare un utente, accedere a un utente e accedere agli end point dell'API Web contrassegnati con [Authorize].Identity Authorize Attribute Roles with Web API

Il mio prossimo passo è limitare gli endpoint dell'API Web usando i ruoli. Ad esempio, un controller a cui possono accedere solo gli utenti nel ruolo di amministratore. Ho creato l'utente amministratore come di seguito e li aggiungo al ruolo di amministratore. Tuttavia, quando aggiorno i miei controller esistenti da [Authorize] a [Authorize(Roles = "Admin")] e provo ad accedervi utilizzando l'account Adim, ottengo uno 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; 
     } 
    } 

D: Qual è il modo corretto di impostare e utilizzare i ruoli?


+0

Avete controllato la tabella Ruolo per il ruolo appena creato 'Admin' e la tabella UserRole per l'utente corretto con ruolo di amministratore? Stai usando identity framework 2.0 o versioni successive? – DSR

risposta

10

Come si imposta rivendicazioni per gli utenti quando il login Credo che vi manca questa riga di codice nel metodo 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")); 

E se si desidera creare l'identità dall'uso DB il qui sotto:

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

Poi nel GrantResourceOwnerCredentials do qui sotto:

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

Funziona, ma non sono sicuro di aver capito perché. Devo combinarlo con 'userManager.AddToRoleAsync'? Nella concessione, devo solo assegnare attestazioni a un'identità se l'utente appartiene a quel ruolo? se tu potessi indicarmi qualche documentazione, lo apprezzerei molto. Grazie! –

+1

È stata aggiornata la risposta, per favore controlla –

+2

Sono nuovo ai token di Claims, ma a me sembra che tutti i token ricevuti dal server abbiano il ruolo di amministratore e supervisore assegnato. I ruoli dell'identità non devono essere recuperati in modo dinamico dai ruoli che questo utente ha? – Mohag519