.net 如何仅在id_令牌中而不在access_令牌IdentityServer 4中包含声明

.net 如何仅在id_令牌中而不在access_令牌IdentityServer 4中包含声明,.net,identityserver4,core,.net,Identityserver4,Core,我正在使用Identity Server 4和隐式授权类型。 我有SPA,它向IS4发出授权请求,响应类型为:“id\u token”。 我使用GetProfileDataAsync方法简单实现了IProfileService: public virtual Task GetProfileDataAsync(ProfileDataRequestContext context) { context.AddRequestedClaims(context.Sub

我正在使用Identity Server 4和隐式授权类型。 我有SPA,它向IS4发出授权请求,响应类型为:“id\u token”。 我使用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;
        }
没关系,我收到了一个访问令牌和一个id令牌。但它们都包含我的自定义声明。
如何在access\u令牌中仅包含“custom1”声明,而在id\u令牌中同时包含“custom1”和“custom2”声明?

配置文件服务会在不同的上下文中多次调用:

  • 对于访问令牌:
    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;
}

好的,多亏了Ruard van Elburg,我才做到了。 正确答案是:

  • 对于访问令牌:Context.Caller=ClaimsProviderAccessToken
  • 对于标识令牌:Context.Caller=ClaimsProviderIdentityToken
  • 对于userinfo端点:Context.Caller=UserInfoEndpoint
和代码:

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

        // Add claims to access token
        if (context.Caller == "ClaimsProviderAccessToken")
        {
            context.IssuedClaims.Add(new Claim("custom1", "custom1"));
        }

        // Add identity token claims
        if (context.Caller == "ClaimsProviderIdentityToken")
        {
            context.IssuedClaims.Add(new Claim("custom1", "custom1"));

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

        // Add userinfo endpoint claims
        if (context.Caller == "UserInfoEndpoint")
        {
            context.IssuedClaims.Add(new Claim("custom1", "custom1"));

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

        return Task.CompletedTask;
    }