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系列之中文文档及实际项目经验分享