Oauth 2.0 如何将用户声明映射到API和标识范围?

Oauth 2.0 如何将用户声明映射到API和标识范围?,oauth-2.0,identityserver4,openid-connect,Oauth 2.0,Identityserver4,Openid Connect,我有一个identity server的实现。我最近发现的一件事是,如果我有一个映射到API/API作用域(openid API作用域)的用户声明(例如图片),即使它与标识作用域关联,该声明也会作为标识作用域删除 为什么在访问令牌和userinfo端点中都需要相同的用户声明? 据我所知,access_令牌用于API/外部系统消费,而我的最终客户端将使用userinfo中的身份信息进行客户端消费。因此,为了避免获得一个大的身份令牌,最好通过后台通道调用userinfo获得这些信息。我知道另一种选择

我有一个identity server的实现。我最近发现的一件事是,如果我有一个映射到API/API作用域(openid API作用域)的用户声明(例如图片),即使它与标识作用域关联,该声明也会作为标识作用域删除

为什么在访问令牌和userinfo端点中都需要相同的用户声明? 据我所知,access_令牌用于API/外部系统消费,而我的最终客户端将使用userinfo中的身份信息进行客户端消费。因此,为了避免获得一个大的身份令牌,最好通过后台通道调用userinfo获得这些信息。我知道另一种选择是将AlwaysInCludeUserClaimsInToken设置为true

目标:从UserInfo端点获取访问令牌中相同的用户声明和响应,而无需始终sincludeuserclaimsindtoken=true

例子 请注意,图片这里只是一个例子来说明这一点,并不是我打算使用的完全相同的用户声明

原始设置(默认)
  • 身份资源:openid
  • 身份声明:图片
  • 客户:AlwaysIncludeUserClaimsInIdToken:错误
客户端范围:openid

返回:

  • 访问令牌(无图片声明)
  • id_令牌(无图片声明)
  • 对UserInfo使用访问令牌:返回声明(包括图片)
附加设置 (假设资源、范围和范围声明是关联的)

  • API资源:OpenIDAPI
  • API作用域:OpenIDAPI作用域
  • API范围声明:图片
返回:

  • 访问令牌(带图片声明)
  • id_令牌(无图片声明)
  • 对UserInfo使用访问令牌:不返回声明图片声明
变通办法
  • 客户:始终包括所有索赔。被告:正确
返回:

  • 访问令牌(带图片声明)
  • id_令牌(带图片声明)
  • 对UserInfo使用访问令牌:不返回声明图片声明

唯一需要用户信息的应用程序是负责UI的客户端。在任何情况下,资源都不需要来自UserInfo端点的额外声明。如果请求需要信息,那么客户机就可以将此信息添加到请求中,作为请求的一部分。请注意,JWT令牌是公共可读的。它包含不应与所有资源共享的有关用户的信息。@RuardvanElburg正如我在我的场景中所说,我不希望API访问UserInfo,但是,在某些情况下,声明与API和客户端相关,例如,如果我想知道用户是否拥有API的权限。API需要通过访问令牌声明,客户端需要知道,以便他们可以决定(例如)隐藏或显示访问API的链接。如果声明与API相关,则应将声明类型添加到范围中,以便将其添加到访问令牌中,如前所述。但请注意,IdentityServer用于验证用户和授权客户端,PolicyServer是用户授权的建议,正如其中一位创建者所评论的。从文章中。这篇文章描述了问题并给出了答案。@RuardvanElburg谢谢。现在有点清楚了。最好的选择(SAN策略服务器)是依赖服务器端支持API,该API可以评估用户的访问,而不是依赖客户端应用程序进行评估。唯一需要UserInfo的应用程序是负责UI的客户端。在任何情况下,资源都不需要来自UserInfo端点的额外声明。如果请求需要信息,那么客户机就可以将此信息添加到请求中,作为请求的一部分。请注意,JWT令牌是公共可读的。它包含不应与所有资源共享的有关用户的信息。@RuardvanElburg正如我在我的场景中所说,我不希望API访问UserInfo,但是,在某些情况下,声明与API和客户端相关,例如,如果我想知道用户是否拥有API的权限。API需要通过访问令牌声明,客户端需要知道,以便他们可以决定(例如)隐藏或显示访问API的链接。如果声明与API相关,则应将声明类型添加到范围中,以便将其添加到访问令牌中,如前所述。但请注意,IdentityServer用于验证用户和授权客户端,PolicyServer是用户授权的建议,正如其中一位创建者所评论的。从文章中。这篇文章描述了问题并给出了答案。@RuardvanElburg谢谢。现在有点清楚了。最好的选择(SAN策略服务器)是依赖服务器端支持API,该API可以评估用户的访问,而不是依赖客户端应用程序进行评估。