自定义资源/声明未在“ userinfo”中返回

时间:2019-05-28 10:50:20

标签: oauth-2.0 identityserver4 openid-connect

我正在尝试向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

我可能只缺少一些细微的细节,但是我无法终生弄清楚是什么...所以我想让它正常工作是什么?

1 个答案:

答案 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")
                }
            }....