我正在使用 Identity Server v4(但我认为与 v3 相同)和 .NET Core。
现在我有一个我不明白的奇怪问题。
在我的 MVC 应用程序中,我使用[授权(角色=“极客”)]保护我的控制器/操作。
从以下位置查看当前用户HttpContext所有角色都可以作为声明使用,而不是作为角色使用(事实上User.IsInRole("极客")返回假)。
此外,我不能将声明与授权属性因为所有角色都使用相同的键存储到声明集合中(当然是“角色”)。
有没有办法自动将所有具有关键“角色”的声明也作为当前委托人的角色?
我尝试使用“令牌验证事件”,但没有成功。
我正在尝试示例存储库,所以我的代码与此非常相似https://github.com/IdentityServer/IdentityServer4.Samples/tree/dev/MVC%20and%20API https://github.com/IdentityServer/IdentityServer4.Samples/tree/dev/MVC%20and%20API
有什么提示吗?
角色声明的“类型”属性值是否为“角色”,还是像“http://schemas.microsoft.com/ws/2008/06/identity/claims/role http://schemas.microsoft.com/ws/2008/06/identity/claims/role如果它是“角色”而不是 URI,您可能会将 InboundClaimTypeMap 设置为空字典,如文档中所述(请参阅声明转换部分here https://identityserver.github.io/Documentation/docsv2/overview/mvcGettingStarted.html)。如果启动代码中有以下行,请尝试将其删除:
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 通知事件中创建新的 ClaimsIdentity。 ClaimsIdentity 构造函数允许您指定匹配声明角色时要使用的文本。在这种情况下,文本只是“角色”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)