在 IdentityServer3 中,如果还请求访问令牌,为什么所有身份声明都从 id_token 中排除?

In IdentityServer3, why are all identity claims excluded from the id_token if an access token is also requested?

我在处理自定义实现时一直在查看 IdentityServer3 的源代码。我在尝试向 id_token 添加声明时遇到问题。我遇到了这段代码 here:

 //From AuthorizeResponseGenerator.cs, method CreateImplicitFlowResponseAsync
 string jwt = null;
 if (responseTypes.Contains(Constants.ResponseTypes.IdToken))
 {
     var tokenRequest = new TokenCreationRequest
     {
           ValidatedRequest = request,
           Subject = request.Subject,
           Client = request.Client,
           Scopes = request.ValidatedScopes.GrantedScopes,

           Nonce = request.Raw.Get(Constants.AuthorizeRequest.Nonce),
           IncludeAllIdentityClaims = !request.AccessTokenRequested, // <---- This line
           AccessTokenToHash = accessTokenValue,
           AuthorizationCodeToHash = authorizationCode
      };

在此 class 中设置 IncludeAllIdentityClaims 属性 会影响程序流达到 here 后添加声明的方式。我的问题是,为什么 IncludeAllIdentityClaims 属性 会抵消与 access_token 相关的值?我认为 access_token 和它可以持有的声明与 id_token 和它持有的相应声明完全无关?

因为规范就是这样写的——它是为了优化令牌大小。我们在范围声明上有一个名为 AlwaysIncludeInIdToken 的设置来禁用此优化。