8

У меня есть небольшое приложение веб-API, которое использует Identity для управления пользователями с использованием маркеров Owin. Основы этой реализации прекрасно работают: я могу зарегистрировать пользователя, войти в систему пользователя и получить доступ к конечным точкам веб-API, отмеченным [Authorize].Роли авторизации авторизованных идентификаторов с веб-интерфейсом API

Следующий шаг - ограничить конечные точки веб-API с помощью ролей. Например, контроллер, к которому могут обращаться только пользователи в роли администратора. Я создал пользователя Admin, как показано ниже, и добавлю их в роль администратора. Однако, когда я обновляю существующие контроллеры от [Authorize] до [Authorize(Roles = "Admin")] и пытаюсь получить к нему доступ с помощью учетной записи Adim, я получаю 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: Что такое правильный способ настроить и использовать роли?


+0

Вы проверили таблицу ролей для вновь созданной роли «Admin» и таблицы UserRole для правильного пользователя с ролью администратора? Используете ли вы среду идентификации 2.0 или новее? – DSR

ответ

10

Как установить требования для пользователей при их входе в системе я верю, что вы пропали без вести этой строки коды в методе 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")); 

И если вы хотите создать идентичность от использования БДА ниже:

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

Тогда в GrantResourceOwnerCredentials сделать ниже:

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

Это работает, но я не уверен, что понимаю почему. Нужно ли комбинировать это с 'userManager.AddToRoleAsync'? Должен ли я присваивать претензии только Identity, если пользователь принадлежит к этой роли? если бы вы могли указать мне на какую-то документацию, я был бы очень признателен. Благодаря! –

+1

Обновлен ответ, пожалуйста, проверьте его –

+2

Я новичок в токенах Claims, но для меня это похоже, что все маркеры, полученные от сервера, будут назначены назначенной роли администратора и супервизора. Не должны ли динамические роли ролей идентифицироваться по ролям, которые этот пользователь имеет? – Mohag519

Смежные вопросы