【问题标题】:How to include claims only in id_token but not in access_token IdentityServer4如何仅在 id_token 中包含声明而不在 access_token IdentityServer4 中包含声明
【发布时间】:2020-06-16 21:18:51
【问题描述】:

我正在使用 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-core identityserver4


    【解决方案1】:

    使用不同的上下文多次调用 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;
    }
    

    【讨论】:

      【解决方案2】:

      好的,感谢 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;
          }
      

      【讨论】:

        猜你喜欢
        • 2020-01-08
        • 2016-10-17
        • 2021-10-06
        • 2021-12-27
        • 2019-03-12
        • 2016-06-18
        • 2017-05-31
        • 2020-01-23
        • 1970-01-01
        相关资源
        最近更新 更多