2

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

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

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

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

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

我试图玩“on token validate event”,但没有成功。

我正在尝试示例存储库,所以我的代码与此https://github.com/IdentityServer/IdentityServer4.Samples/tree/dev/MVC%20and%20API完全相同

有什么提示吗?

4

1 回答 1

1

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

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 构造函数允许您指定匹配声明角色时要使用的文本。在这种情况下,文本只是“角色”。

于 2016-07-11T10:01:37.693 回答