我确信这归结为缺乏理解。
我正在尝试在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(&#34; given_name&#34;,&#34; bob&#34;)); //使用主题ID和用户名发出身份验证Cookie 等待HttpContext.SignInAsync(user.SubjectId,user.Username,props);
当QuickStart站点和MVC客户端运行时,我可以成功登录。然后,Secure页面向我显示下面的声明(在启用AlwaysIncludeUserClaimsInIdToken之后)
但是,如果我访问IdentityServer4快速入门的Grants部分,并检查当前的User
,我会看到一组完全不同的声明,如下所示:
如何在IdentityServer4快速入门中访问ID令牌中返回的相同声明列表?
我的具体原因是我将Active Directory UPM存储为其中一项声明,并且当用户位于我们的Identity Server中的任何安全页面内时,都需要访问它。
答案 0 :(得分:2)
好的 - 经过一天的游戏,我意识到HttpContext.SignInAsync()
方法还有其他一些替代。
之前,我有这个 - 按照教程
await HttpContext.SignInAsync(user.SubjectId, user.Username, props);
将此更改为
await HttpContext.SignInAsync(user.SubjectId, user.Username, props, user.Claims.ToArray());
给我正是我想要的。
离开这里,其他人也有同样的问题。