【问题标题】:The User.IsInRole("Administrators") with IClaimsTransformer always false带有 IClaimsTransformer 的 User.IsInRole("Administrators") 始终为假
【发布时间】:2016-08-15 21:26:21
【问题描述】:

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

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

【问题讨论】:

  • 您是否尝试添加完全相同的声明?即我不会认为它不区分大小写
  • 是的。我在调试时看到了用户声明中的角色。
  • 你试过 .HasClaim 看看有什么不同吗?您确定在转换后检查索赔吗?
  • User.HasClaim("http://schemas.microsoft.com/ws/2008/06/identity/claims/role", "Administrators") 是真的。但是User.IsInRole("Administrators") 是假的。

标签: asp.net-core identityserver4


【解决方案1】:

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

查看User.IsInRole()documentation 后,似乎此方法旨在首先从缓存中提取。

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

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

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

var claimsResult = await _userManager.AddClaimAsync(applicationUser, new Claim(ClaimsIdentity.DefaultRoleClaimType, "Administrator"));

【讨论】:

    【解决方案2】:

    我遇到了完全相同的问题 - 当我将声明添加到已经存在的身份 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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-20
      • 2016-04-19
      • 1970-01-01
      • 2021-03-05
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 2023-02-14
      相关资源
      最近更新 更多