IdentityServer 网站中缺少的声明,包括所有样本

Posted

技术标签:

【中文标题】IdentityServer 网站中缺少的声明,包括所有样本【英文标题】:Missing Claims from within the IdentityServer Website, including all samples 【发布时间】:2018-08-01 13:51:29 【问题描述】:

我确信这是由于缺乏理解。

我正在尝试在 IdentityServer 实例中访问当前登录的用户声明。我发现我向用户提供的任何声明仅适用于设置客户端,而不适用于 IdentityServer 本身。

可以使用 IdentityServer4 团队 (QuickStart Samples) 提供的任何快速入门示例来复制我的问题

我正在构建一个站点,该站点将使用 IdentityServer4 提供身份验证,并提供一些界面屏幕来管理您自己的个人资料。为了促进这一点,我需要从 IdentityServer 站点中访问声明。

如果我们查看快速启动中的测试用户,我们有这个用户:

            new TestUser
            
                SubjectId = "1",
                Username = "alice",
                Password = "password",

                Claims = new List<Claim>
                
                    new Claim("name", "Alice"),
                    new Claim("website", "https://alice.com")
                
            ,

我们可以看到它有 2 个声明;名称和网站。

在登录控制器中,我还添加了另一个声明,就在登录之前(通过实验)

user.Claims.Add(new Claim("given_name", "bob")); // 发出带有主题 ID 和用户名的身份验证 cookie await HttpContext.SignInAsync(user.SubjectId, user.Username, props);

当 QuickStart 站点和 MVC 客户端正在运行时,我可以成功登录。然后安全页面向我显示以下声明(启用 AlwaysIncludeUserClaimsInIdToken 后)

但是,如果我访问 IdentityServer4 快速入门的 Grants 部分,并检查当前的 User,我会看到一组完全不同的声明,如下所示:

如何在 IdentityServer4 快速入门中访问 ID 令牌中返回的相同声明列表?

我的具体原因是我将存储一个 Active Directory UPM 作为声明之一,并且当用户在我们的身份服务器中的任何安全页面中时需要访问它。

【问题讨论】:

【参考方案1】:

好的 - 在玩了一天之后,我意识到 HttpContext.SignInAsync() 方法还有其他覆盖。

之前,我有这个 - 按照教程

await HttpContext.SignInAsync(user.SubjectId, user.Username, props);

改成

await HttpContext.SignInAsync(user.SubjectId, user.Username, props, user.Claims.ToArray());

给了我我想要的东西。

把这个留在这里,以免其他人有同样的问题。

【讨论】:

以上是关于IdentityServer 网站中缺少的声明,包括所有样本的主要内容,如果未能解决你的问题,请参考以下文章

code_challenge 缺少 IdentityServer4 (v4.1.2) Mvc 客户端

IdentityServer4系列之中文文档及实际项目经验分享

如何在 IdentityServer4 中添加自定义声明以访问令牌? [关闭]

如何在 IdentityServer4 上添加电话号码声明

IdentityServer4 Ws 联合声明

通过 AddIdentityServer 向 IdentityServer 设置添加声明