7

administrators在身份验证后将角色添加到用户声明中,IClaimsTransformer如下所示:

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

4

2 回答 2

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"));
于 2017-01-05T19:09:39.890 回答
0

我遇到了完全相同的问题 - 当我将声明添加到已经存在的身份时User.IsInRole总是返回 false(即使我可以看到该身份具有该角色),但是当我添加第二个ClaimsIdentity声明时它工作得很好:

var id = new ClaimsIdentity();

id.AddClaim(new Claim(ClaimTypes.Role, role.RoleName));

// I actually returned a clone of the principal every time, not the original principal
clone.AddIdentity(id);

我承认我还不完全明白为什么,但它对我有用。

于 2020-03-05T16:19:01.520 回答