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

Mik*_*son 6 asp.net-core identityserver4

administrators在身份验证后将角色添加到用户声明,IClaimsTransformer其中包含以下内容:

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

小智 1

我在基于 API 的解决方案中做了类似的事情,但我在创建用户时设置了角色声明,而不是在变压器中。

查看User.IsInRole() 文档后,似乎该方法被设计为首先从缓存中提取。

IsInRole 首先检查 IsRoleListCached 属性以确定当前用户的角色名称缓存列表是否可用。如果 IsRoleListCached 属性为 true,则检查缓存列表中的指定角色。如果 IsInRole 方法在缓存列表中找到指定的角色,则返回 true。如果 IsInRole 未找到指定的角色,它将调用默认 Provider 实例的 GetRolesForUser 方法来确定用户名是否与配置的 ApplicationName 值的数据源中的角色关联。

我怀疑,由于ClaimTypes.Role这是一个常见的声明,而不是自定义的特定于域的声明(我认为这是 ClaimsTransformer 的用例),因此应用程序正在使用默认的缓存预转换值。

不过,其中大部分都是猜测。您可以尝试在创建用户时设置声明。我使用 UserManager 类来完成此操作。

var claimsResult = await _userManager.AddClaimAsync(applicationUser, new Claim(ClaimsIdentity.DefaultRoleClaimType, "Administrator"));
Run Code Online (Sandbox Code Playgroud)