具有IClaimsTransformer的User.IsInRole(" Administrators")始终为false

时间:2016-04-22 09:54:12

标签: asp.net-core identityserver4

我在使用administrators这样做的身份验证后,将角色IClaimsTransformer添加到用户声明中:

(principal.Identity as ClaimsIdentity).AddClaim(new Claim(ClaimTypes.Role, "Administrators")); 但是当我在Razor视图中调用User.IsInRole("Administrators")时,它会返回false。

2 个答案:

答案 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

我承认我还不完全理解为什么,但这对我有用。