【问题标题】:IdentityManager does not get all claimsIdentityManager 未获得所有声明
【发布时间】:2016-03-26 19:27:36
【问题描述】:

我有一个 IdentityServer,只有一个混合流客户端,它为 AllowedScopes 设置 "all_claims"。在另一台计算机上,我有一个连接到 IdSvr 以登录用户的 MVC 应用程序。它还为 IdMgr 设置了 /admin 绑定。我可以毫无问题地登录到主应用程序和 IdMgr。同样在用户登录后的主应用程序中,我按预期获得了所有声明,但在 IdMgr 中没有。

我正在尝试根据声明在 IdMgr 中添加一些自定义逻辑。但是当我在任何 IdMgr 控制器中得到Thread.CurrentPrincipal 时,它是空的!我得到的只是一个只有角色声明的 ClaimsPrincipal 对象。它还有一个 ClaimsIdentity 对象,具有以下属性:

AuthenticationType: "Bearer"
IsAuthenticated: true
NameClaimType: "name"
RoleClaimType: "role"

其他的都是空的。甚至没有用户的名称或 ID。为什么会这样?如何在 IdentityManager 中获取所有声明?

要重现这一点,只需检查 UsersController 中的 GetUsersAsync 方法中的 System.Threading.Thread.CurrentPrincipal

在 GitHub 上链接到此 issue

【问题讨论】:

    标签: asp.net-identity claims-based-identity thinktecture-ident-server identityserver3 identitymanager


    【解决方案1】:

    在身份管理器范围内尝试 IncludeAllClaimsForUser = true

                new Scope{
                    Name = IdentityManager.Constants.IdMgrScope,
                    DisplayName = "IdentityManager",
                    Description = "Authorization for IdentityManager",
                    Type = ScopeType.Identity,
                    IncludeAllClaimsForUser = true
    

    【讨论】:

    • 我应该把它放在客户端代码 (IdMgr) 还是 IdSvr 中?我在 IdMgr 中看到的唯一设置范围的地方是 this,其中范围仅为字符串。
    • 这应该在 Idsrv Scope 配置中进行配置。抱歉,它似乎无法回答您的问题。正如 Brock 上面评论的那样,主体中仅存在角色和名称声明。在我看来,它第一次解决了空 currentprincipal 的问题。但我可能错过了其他东西。
    【解决方案2】:

    如果您想要 IdMgr 的自定义声明,那么我建议您在管道中进行声明转换。

    【讨论】:

    • 我愿意,但我在任何 IdMgr 操作方法中获得的 ClaimsPrincipal 不包括自定义用户声称要转换。看起来 IdMgr 正在用过滤的对象覆盖 Thread.CurrentPrincipal
    • IdMgr 仅接受来自外部 Idp 的名称和角色声明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 2019-06-01
    • 2017-10-23
    相关资源
    最近更新 更多