我正在开发一个.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()
。如果是这样的话,那么正确的方法是什么?感谢
答案 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"));