我正在使用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
相同任何提示?
答案 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构造函数允许您指定匹配声明角色时要使用的文本。在这种情况下,文本只是“角色”。