C# ProfileDataRequestContext.RequestedClaimTypes在请求API资源以外的作用域时始终为空?

C# ProfileDataRequestContext.RequestedClaimTypes在请求API资源以外的作用域时始终为空?,c#,asp.net-core,jwt,identityserver4,claims-based-identity,C#,Asp.net Core,Jwt,Identityserver4,Claims Based Identity,当请求的键值对scopes没有API资源(但其他资源,如身份资源-openid、配置文件、电话等)时,为什么ProfileDataRequestContext.RequestedClaimTypesnull 为什么它们不算作“被要求的”?那么,人们如何知道将要生成的JWT中包含哪些声明 显然,如果我请求一个API资源,并且我的所有声明都列在UserClaims属性下,那么一切都会按预期进行。(此处列出的权利要求添加到requestedClaimTypes集合中。) 谢谢大家! 创建令牌时调用Pr

当请求的键值对
scopes
没有API资源(但其他资源,如身份资源-openid、配置文件、电话等)时,为什么
ProfileDataRequestContext.RequestedClaimTypes
null

为什么它们不算作“被要求的”?那么,人们如何知道将要生成的JWT中包含哪些声明

显然,如果我请求一个API资源,并且我的所有声明都列在
UserClaims
属性下,那么一切都会按预期进行。(此处列出的权利要求添加到
requestedClaimTypes
集合中。)


谢谢大家!

创建令牌时调用ProfileService,但上下文不同:

  • Context.Caller=ClaimsProviderAccessToken
  • Context.Caller=UserInfoEndpoint
因此,它取决于生成的令牌的类型

对于访问令牌,只允许使用资源作用域(ApiResources),对于返回的标识令牌,只允许使用标识作用域(IdentityResources)


尽管默认情况下,id_令牌将只包含
子声明。可以在UserInfo端点请求其他信息。

这必须解释清楚。我在测试ResourceOwnerPasswordCredentials流,我相信该流从未颁发过身份令牌,对吗?因此,如果在
作用域
键值对中请求了任何Api资源,那么为什么访问令牌只会添加声明。如果您以后使用该访问令牌从UserInfo端点请求标识作用域,它会失败吗?请您确认一下?@SpiritBob ROPC是oauth2,而不是oidc。因此,该流中没有id_令牌。对于其他流,这取决于客户端请求的内容。如果客户端请求“profile”作用域,或者启用了选项GetClaimsFromUserInfoEndpoint,那么该端点将在某个点被命中,或者客户端可以访问该端点。我不确定是否也为作为登录结果一部分的id_令牌调用端点,因为该令牌将只包含子声明。配置文件是一个范围,可能需要用户同意。因此,是的,客户必须请求范围。如果id_令牌作为流的一部分被请求,那么它将只包含子声明。但是在这种情况下,客户端可以使用访问令牌从UserInfo端点请求完整的id_令牌。当客户端未请求配置文件作用域或用户未给予同意时,端点本身不会失败(如BadRequest),配置文件声明将不会包含在令牌中。@是的,是签名的一部分,是验证令牌所必需的声明。但它不包含除
sub
之外的“用户”声明。尽管进行了优化,但令牌仍然相当大,链接文章的评论部分也提到了这一点。