不为身份令牌调用 IdentityServer4 GetProfileDataAsync,仅调用访问令牌

IdentityServer4 GetProfileDataAsync is not called for Identity Token, only Access Token

使用 IdentityServer 4 (4.1.2),我添加了一个 class 实现 IProfileService 接口。 GetProfileDataAsync 方法应该被调用多次(针对每个令牌),但我的方法仅针对访问令牌 (ClaimsProviderAccessToken) 调用。

  public class LocalUserProfileService : IProfileService
  {
    private readonly IIdentityProviderUserService _identityProviderUserService;

    public LocalUserProfileService(IIdentityProviderUserService identityProviderUserService)
    {
      _identityProviderUserService = identityProviderUserService ??
        throw new ArgumentNullException(nameof(identityProviderUserService));
    }
    public async Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
      var subjectId = context.Subject.GetSubjectId();
      var claims = (await _identityProviderUserService.GetUserClaimsBySubjectAsync(subjectId)).ToList();
      
      Debug.WriteLine($"Adding claims to {context.Caller}");
      context.IssuedClaims.AddRange(claims);
      
    }

    public async Task IsActiveAsync(IsActiveContext context)
    {
      var subjectId = context.Subject.GetSubjectId();
      context.IsActive = await _identityProviderUserService.IsUserActiveAsync(subjectId);
    }
  }

我可以设法只使用我的访问令牌来获取自定义声明,但我想知道为什么不为 identity_token 调用代码,因为我更喜欢在两个令牌中都有声明。

您是否已将 AlwaysIncludeUserClaimsInIdToken 标志设置为 true?否则,ID-token 的声明将通过 UserInfo 端点提供。

减小 ID-token 大小的一种常见方法是不包含 ID-token 中的所有声明。大令牌也会导致大会话 cookie。默认情况下,令牌存储在会话 cookie 中。