【问题标题】:IdentityServer, Claims and RolesIdentityServer、声明和角色
【发布时间】:2023-03-22 18:20:01
【问题描述】:

我正在使用 Identity Server v4(但我认为与 v3 相同)和 .NET Core。

现在我有一个奇怪的问题,我不明白。

在我的 MVC 应用程序中,我使用 [Authorize(Roles="Geek")] 来保护我的控制器/操作。 从 HttpContext 中查看当前用户,所有角色都可用作声明而不是角色(实际上 User.IsInRole("Geek") 返回 false)。

此外,我不能将声明与 authorize 属性一起使用,因为所有角色都使用相同的键(当然是“角色”)存储到声明集合中。

有没有办法自动将所有具有关键“角色”的声明也作为当前委托人的角色?

我尝试使用“令牌验证事件”但没有成功。

我正在尝试示例 repo,所以我的代码与 https://github.com/IdentityServer/IdentityServer4.Samples/tree/dev/MVC%20and%20API 非常相似

有什么提示吗?

【问题讨论】:

    标签: asp.net-identity identity claims-based-identity identityserver3 identityserver4


    【解决方案1】:

    角色声明是否具有“角色”的“类型”属性值,还是像“http://schemas.microsoft.com/ws/2008/06/identity/claims/role”这样的 URI?如果它是“角色”而不是 URI,您可能会将 InboundClaimTypeMap 设置为文档中所述的空字典(请参阅声明转换部分 here)。如果您的启动代码中有以下行,请尝试将其删除:

    JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();
    

    默认 InboundClaimTypeMap 会将一些 JWT 声明映射到使用完整 URI 的 System.Security.Claims.ClaimTypes。其中之一是角色。

    ClaimsIdentity 的 IsInRole 方法将使用名为 RoleClaimType 的属性来确定要与声明的 Type 属性匹配的字符串值,以查找可用角色的列表。然后将您所需的角色文本与匹配声明的结果列表中的值进行匹配。默认 ClaimsIdentity 将使用 System.Security.Claims.ClaimTypes.Role 在身份中查找角色声明。

    如果您希望您的应用继续使用 JWT 声明类型语法,您需要在 SecurityTokenValidated Notification 事件中创建一个新的 ClaimsIdentity。 ClaimsIdentity 构造函数允许您指定匹配声明角色时要使用的文本。在这种情况下,文本只是“角色”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-27
      • 2018-02-10
      • 2016-10-16
      • 2023-03-19
      • 1970-01-01
      • 2015-06-20
      • 2015-07-28
      • 2015-04-20
      相关资源
      最近更新 更多