首页 > 解决方案 > 如何仅在 id_token 但不在 access_token IdentityServer4 中包含声明

问题描述

我正在使用 Identity Server 4 和隐式授权类型。我有一个 SPA,它使用 response_type: 'id_token token' 向 IS4 发出授权请求。

我有一个使用 GetProfileDataAsync 方法的 IProfileService 的简单实现:

public virtual Task GetProfileDataAsync(ProfileDataRequestContext context)
        {
            context.AddRequestedClaims(context.Subject.Claims);

            context.IssuedClaims.Add(new Claim("custom1", "custom1"));

            context.IssuedClaims.Add(new Claim("custom2", "custom2"));

            return Task.CompletedTask;
        }

它工作正常;我收到一个 access_token 和一个 id_token。但它们都包含我的自定义声明。

如何在 access_token 中仅包含“custom1”声明,但在 id_token 中包含“custom1”和“custom2”声明?

标签: .net-coreidentityserver4

解决方案


Profile Service 在不同的上下文中被多次调用:

  • 对于访问令牌Context.Caller = ClaimsProviderAccessToken
  • 对于身份令牌Context.Caller = UserInfoEndpoint

对于特定于上下文的声明,您应该检查上下文调用者:

public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
    context.AddRequestedClaims(context.Subject.Claims);

    context.IssuedClaims.Add(new Claim("custom1", "custom1"));

    // Add access token claims
    if (Context.Caller == "ClaimsProviderAccessToken")
    {
    }

    // Add identity token claims
    if (Context.Caller == "UserInfoEndpoint")
    {
        context.IssuedClaims.Add(new Claim("custom2", "custom2"));
    }
    return Task.CompletedTask;
}

推荐阅读