【问题标题】:User.IsInRole() fails when in multiple roles retrieved from Identity Server 4 token当从 Identity Server 4 令牌中检索到多个角色时,User.IsInRole() 失败
【发布时间】:2021-08-15 04:43:00
【问题描述】:

如果令牌中只有一个角色,则 User.IsInRole() 有效

但是,如果有多个角色,那么它不会

这是添加角色的方式(看起来和网上很多其他帖子一样)

这是从声明中解码角色的方式

这似乎对人们有用,我已经读过他们像我一样将角色作为数组返回,但它有效。所以,我认为配置中有一些关于获取角色的内容,但我没有想法,希望 SO 的伟大社区可以提供帮助!

更新 1

我修改了这行 options.ClaimActions.MapUniqueJsonKey( "role", "role", "role" );options.ClaimActions.MapJsonKey( "role", "role" );

现在我的声明看起来像:

所以角色现在从数组中分离出来,但 IsInRole() 仍然无法找到管理员(和其他人)

【问题讨论】:

  • 删除 OIDC 身份验证配置中的 .MapUniqueJsonKeyRoleClaimType = 。使用默认值,它们工作正常。
  • 不幸的是,同时删除或仅删除 MapUniqueKey 会导致 0 个角色出现在权限测试页面中。
  • 将token粘贴到jwt.io时,可以看到一个角色数组,对吧?
  • 确实 - "role": [ "InstitutionalAdmin", "IDS_Admin", "Administrator" ],一个角色好像还可以,只是多个
  • 好的,导出所有声明 (User.Claims.Select(c => new { c.Type, c.Value }).ToList()),应该有多个 http://schemas.microsoft.com/ws/2008/06/identity/claims/role 类型的角色声明。然后看看它是否匹配身份的RoleClaimType (User.Identities.First().RoleClaimType)。确保您使用的是默认设置,(删除我上面提到的覆盖)

标签: authorization identityserver4 roles claims


【解决方案1】:

正确的组合是:

由于默认的roleClaimType 是http://schemas.microsoft.com/ws/2008/06/identity/claims/role,这需要与实际发送的声明相匹配。就我而言,这只是“角色”。因此

options.TokenValidationParameters = new TokenValidationParameters
{
    RoleClaimType = "role",
    NameClaimType = "name"
};

需要指定“角色”是要查找的声明。然而,这还不够。角色声明未添加到声明列表中。这行代码是必需的:

options.ClaimActions.MapJsonKey( "role", "role" );

这表示“角色”声明类型(参数 1)查看 json 令牌并找到“角色”的 json 键(参数 2)。现在,这足以将角色添加到用户的声明列表中。

在我打印在 /permissions 页面上的声明列表中,我看到了

role InstitutionalAdmin
role IDS_Admin
role Administrator

打印出来,现在列出了三个声明(不在数组中)

IsInRole 现在也表现良好:

Administrator
True
Attendee
False
InstitutionalAdmin
True
ModuleUserAdmin
False
IDS_Admin
True

这是打印出来的一个子集,但现在在 IsInRole 调用中将三个声明角色设置为 True。不确定与 Update1 到底有什么不同,但有待进一步测试,它现在看起来不错。

我的最后一点是首先感谢https://stackoverflow.com/users/5298150/abdusco 参与并促使我查看并理解每个参数的含义。其次,我始终相信粘贴您在网络上找到的代码是好的,并且是合理的(为什么要重新发明轮子),但请花时间充分了解它的作用以及它为什么存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-30
    • 2021-01-17
    • 2018-06-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 2018-12-01
    相关资源
    最近更新 更多