IdentityServer,声明和角色

时间:2016-07-10 18:42:28

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

我正在使用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

相同

任何提示?

1 个答案:

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