ASP.NET核心身份角色,声明和用户

时间:2017-02-03 12:21:42

标签: asp.net-core asp.net-identity claims-based-identity

我是一名ASP.NET核心初学者。我陷入了角色,主张和用户关系中。

我有一个用户 Ben ,用户属于管理员角色。 管理员角色在数据库中声明了查看页面编辑页面

但我不能让声明和角色属于该用户:

(请参阅代码中的评论)

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 Identity有5个表:

  • 用户。
  • 角色。
  • UserRoles - 用户可以拥有多个角色。
  • RoleClaims - 一个角色可以有很多声明。
  • UserClaims - 用户可以拥有多个声明。

我认为对吗?为什么userManager.GetClaimsAsync(user)返回空索赔?

有什么建议吗?

2 个答案:

答案 0 :(得分:6)

  

为什么userManager.GetClaimsAsync(user)返回空索赔?

因为UserManager.GetClaimsAsync(user)查询UserClaims表。同样的 RoleManager.GetClaimsAsync(role)查询RoleClaims表。

但是,当用户是角色的成员时,通过ASP.NET Identity Core中的设计,他们会自动继承角色的声明。您可以检查ClaimsPrincipal,例如在控制器操作中:

var claims = User.Claims.ToList();

您可以在UserClaimsPrincipalFactory.cs中看到用户创建ClaimsPrincipal的代码。

答案 1 :(得分:1)

我最近不得不处理这个问题,并解决了来自角色的特定声明定位用户的问题,即使用角色声明中的值创建一个新的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));
                }
            }
        }
    }
}

这允许我更新/删除具有声明的角色,并将这些更改传递给已分配角色和声明的要重新发布/删除的用户。但是,我仍在用更少的代码寻找更优雅/更容易的东西。