我在使用administrators
这样做的身份验证后,将角色IClaimsTransformer
添加到用户声明中:
(principal.Identity as ClaimsIdentity).AddClaim(new Claim(ClaimTypes.Role, "Administrators"));
但是当我在Razor视图中调用User.IsInRole("Administrators")
时,它会返回false。
答案 0 :(得分:1)
我在基于API的解决方案中做了类似的事情,但是在创建用户时设置了角色声明,而不是在变换器中设置。
查看User.IsInRole()
documentation后,似乎此方法旨在首先从缓存中提取。
IsInRole首先检查IsRoleListCached属性以确定 是否可以使用当前用户的缓存的角色名称列表。 如果IsRoleListCached属性为true,则检查缓存的列表 对于指定的角色。如果IsInRole方法找到指定的 在缓存列表中的角色,它返回true。如果IsInRole没有找到 在指定的角色中,它调用默认的GetRolesForUser方法 用于确定用户名是否关联的提供程序实例 使用配置的ApplicationName的数据源中的角色 值。
我怀疑ClaimTypes.Role
是一个常见的声明,而不是自定义的特定于域的声明(我认为是ClaimTransformer的用例),应用程序使用默认的,缓存的,预转换值
但大部分都是猜测。您可以在创建用户时尝试设置声明。我使用UserManager类来完成它。
var claimsResult = await _userManager.AddClaimAsync(applicationUser, new Claim(ClaimsIdentity.DefaultRoleClaimType, "Administrator"));
答案 1 :(得分:0)
我遇到了完全相同的问题-将声明添加到已经存在的标识User.IsInRole
时始终返回false(即使我可以看到标识具有该角色),但是当我添加第二个{ {1}}声称效果很好:
ClaimsIdentity
我承认我还不完全理解为什么,但这对我有用。