2017-02-03 11 views
7

Я новичок ASP.NET Core. Я застрял в роли, претензии и пользовательских отношениях.Роль Идентификации, претензии и пользователь ASP.NET

У меня есть пользователь Ben, пользователь принадлежит к Admin роль. Администратор Роль имеет претензии View-pages и Редактировать-страницу в базе данных.

Но я не могу получить претензии и роли быть принадлежащие этому пользователю:

(смотрите комментарий в коде)

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'] 
    } 
    } 
} 

На мой взгляд, я понимаю, когда пользователь является членом Роль, он наследует требования этой роли.

По умолчанию ASP.NET Идентичность есть 5 таблиц:

  • пользователей.
  • Роли.
  • UserRoles - Пользователь может иметь много ролей.
  • RoleClaims - Роль может иметь много претензий.
  • UserClaims - Пользователь может иметь много претензий.

Я считаю правильным? Почему userManager.GetClaimsAsync (пользователь) возвращает пустые претензии?

Любое предложение?

ответ

5

Почему userManager.GetClaimsAsync (пользователь) возвращает пустые претензии?

Потому что UserManager.GetClaimsAsync(user) запрашивает таблицу UserClaims. То же самое для RoleManager.GetClaimsAsync(role) задает таблицу RoleClaims.

Но по дизайну в ASP.NET Identity Core, когда пользователь является членом роли, они автоматически наследуют утверждения роли. Вы можете проверить ClaimsPrincipal, например, внутри действия контроллера:

var claims = User.Claims.ToList(); 

Вы можете увидеть код UserClaimsPrincipalFactory.cs, который создает ClaimsPrincipal от пользователя.

+0

Мне нужно получить претензии пользователей на создание JWT в веб-api, поэтому, если токен не содержит действительных заявлений/ролей пользователя, я не могу использовать User.Claims. И я думаю UserManager.GetClaimsAsync (пользователь) запрашивает, что таблица UserRoles неверна, именно она запрашивает таблицу UserClaims. Есть ли у вас какие-либо предположения для этой ситуации? – trinvh

+0

@trinvh "UserManager.GetClaimsAsync (пользователь) запрашивает UserRoles" был опечаткой, исправил его спасибо – tmg

+0

Я отметил правильный ответ из-за вышеуказанной ссылки. Для всех, кто хочет получить заявки от пользователей, необходимо будет увидеть метод createAsync – trinvh

0

Я имел дело с этим вопросом в последнее время и решить проблему определения местоположения пользователей по конкретной претензии, прилагаемой из роли, чтобы создать новый объект Claim со значениями от роли претензии:

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

Это позволило мне обновить/удалить роль с претензиями и передать эти изменения пользователям, которые будут повторно отправлены/удалены, которым были назначены роли и претензии. Тем не менее, я все еще ищу что-то более элегантное/легче с меньшим количеством кода.