我是一名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个表:
我认为对吗?为什么userManager.GetClaimsAsync(user)返回空索赔?
有什么建议吗?
答案 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));
}
}
}
}
}
这允许我更新/删除具有声明的角色,并将这些更改传递给已分配角色和声明的要重新发布/删除的用户。但是,我仍在用更少的代码寻找更优雅/更容易的东西。