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

tri*_*nvh 12 claims-based-identity asp.net-identity asp.net-core

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

我有一个用户Ben,用户属于Admin角色.管理员角色在数据库中具有声明视图页面编辑页面.

但我无法获得属于该用户的声明和角色:

(请参阅代码中的评论)

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']
    }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我看来,我理解当用户是某个角色的成员时,他会继承该角色的声明.

默认ASP.NET标识有5个表:

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

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

有什么建议吗?

tmg*_*tmg 7

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

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

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

var claims = User.Claims.ToList();
Run Code Online (Sandbox Code Playgroud)

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