在JWT授权中,检查用户是否具有角色Admin

时间:2017-08-15 12:15:59

标签: asp.net-core jwt

我正在开发一个.Net Core API,在我的Controller中,我有以下代码:

if (User.Identity.IsAuthenticated)
{
    var username = HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
    var user = await _userManager.FindByNameAsync(username);
    artistCardDtoCollection = _artistsService.GetAllArtists(user.Id, User.IsInRole("Admin"));
}

上面的代码是因为我希望将User.Id(如果已登录)和IsAdmin标记传递给我的GetAllArtists方法。

上面的代码在User.IsInRole("Admin")上失败了。当我100%知道相关用户是管理员时,我会收到false。我已经通过SQL Management Studio双重检查数据库。

这让我觉得在使用JWT时不能使用User.IsInRole()。如果是这样的话,那么正确的方法是什么?感谢

1 个答案:

答案 0 :(得分:1)

可能是User.IsInRole()的缓存问题,如果我们检查documentation,我们会发现:

  

IsInRole first 检查 IsRoleListCached 属性以确定   是否可以使用当前用户的缓存的角色名称列表。   如果IsRoleListCached属性为true,则检查缓存的列表   对于指定的角色。如果IsInRole方法找到指定的   在缓存列表中的角色,它返回true。如果IsInRole没有找到   在指定的角色中,它调用默认的GetRolesForUser方法   用于确定用户名是否关联的提供程序实例   使用配置的ApplicationName的数据源中的角色   值。

在您的情况下,您可以尝试使用GetRolesAsync,如下所示:

var user = await _userManager.FindByNameAsync(username);
var roles = await _userManager.GetRolesAsync(user);
artistCardDtoCollection = _artistsService.GetAllArtists(user.Id, roles.Contains("Admin"));