我正在尝试向IdentityServer4流添加一些自定义声明,但是我无法让它们显示在/userinfo
端点中。
我现在仅使用“内存中”配置,因此在此我使用自定义范围创建了一个新的IdentityResource
:
new IdentityResource {
DisplayName = "My Custom Resource",
Name = "mycustom",
UserClaims = new List<string> {
"mycustom.myvalue"
}
}
并且我已经设置了客户端可以使用此功能:
new Client {
AllowedScopes = {
IdentityServerConstants.StandardScopes.OpenId,
"mycustom"
}
}
然后,无论何时成功登录,我都会执行以下操作来登录用户,然后重定向回/authorize/callback
await _events.RaiseAsync(new UserLoginSuccessEvent(
"provider",
"providerUserID",
"subjectID",
"name"));
await HttpContext.SignInAsync(
"subject",
"name",
new AuthenticationProperties(),
new Claim("mycustom.myvalue", "987654321"));
现在,我可以使用authorize
进行完整的?scope=openid+mycustom
流程,但是当我调用userinfo
端点时,它不会返回mycustom.myvalue
我可能只缺少一些细微的细节,但是我无法终生弄清楚是什么...所以我想让它正常工作是什么?
答案 0 :(得分:0)
这是行不通的,因为当您通过HttpContext.SignInAsync(..., new Claim("mycustom.myvalue", "987654321"))
添加声明时,仅当用户实际在场并且通过cookie身份验证创建ClaimsPrincipal
时,声明才会保留。
因为您正在进行回退到/userinfo
的操作,所以只会向您声明默认的IProfileService
通常会返回,并且可能无法得知该额外声明。
尝试将此声明直接添加到TestUser
之一(如果您使用的是内存用户):
public static List<TestUser> GetUsers()
{
return new List<TestUser>
{
new TestUser
{
SubjectId = "1",
Username = "alice",
Password = "password",
Claims = new []
{
new Claim("name", "Alice"),
new Claim("website", "https://alice.com"),
new Claim("mycustom.myvalue", "987654321")
}
}....