访问令牌不包括 Identity Server 4 中声明的范围

Posted

技术标签:

【中文标题】访问令牌不包括 Identity Server 4 中声明的范围【英文标题】:Access token does not include scopes declared in Identity Server 4 【发布时间】:2021-10-01 06:57:26 【问题描述】:

大致遵循Scott's 指南,我让它与授权代码流一起工作。但是,当我调查众所周知的时,我看到 junky_scope 被列为受支持。我的客户端和 API 范围/资源声明如下。访问令牌中的声明将基于IDS4's GitHub 规定的 API 范围。

public static IEnumerable<ApiScope> Obtain()

  yield return new ApiScope("junky_scope", "Junky Scope"); ...


yield return new ApiResource

  Name = "blopp", ...
  Scopes = new List<string>  "awesome_scope", "junky_scope", ... 
;

yield return new Client

  ClientId = "spa_client",
  AllowOfflineAccess = true,
  AllowedGrantTypes = GrantTypes.Code, ...
  AllowedScopes = new List<string>  "openid", "awesome_scope", "junky_scope" 
;

调用将我的代码交换为令牌的调用会生成一个有效的访问令牌,但仅包含 openidoffline_access 范围。使用刷新令牌请求新令牌时也是如此。在正文中传递的有效负载如下所示。我尝试不指定 范围 来获取所有受支持的令牌(如承诺的 in the docs),但没有成功。

client_id=spa_client &scope=junky_scope &redirect_uri=http://localhost:44304/beep &code=205D...EDBF &grant_type=authorization_code

设置与this question 和this one 中的设置非常相似,尽管它们处理的问题不同。不过,声明的范围显示为包含在响应中。

起初我认为这可能与我的测试用户的定义有关,但那里没有任何关于声明的内容,我能看到的最接近的是声明。但我不依赖我范围内的声明,所以这是一条死胡同。

我迷路了,不知道如何进一步排除故障。 ids4 访问令牌范围不包括的谷歌搜索变化很少。

【问题讨论】:

【参考方案1】:

我不是很喜欢回答我自己的问题,但有时需要。

显然,IDS4 中有一个错误(或者,至少在the documentation 中有一个非常不清楚的地方)。声明如下。

范围一个或多个注册范围。如果未指定,则会为所有明确允许的范围颁发令牌。

这是不正确的,因此我的困惑导致了这个问题。


现在,如果我要为 IDS4 文档辩护,it is said 还需要该参数是授权(不是交换或续订)请求所必需的。

范围一个或多个注册范围(必需)。

现在,除了明显的差异并列在不同的页面上之外,如果我们将明确允许的范围解释为授权期间引用的范围,而不是服务器的客户端、API 范围/资源中引用的范围,那么是的,文档没有错。但从我的立场来看,这是对 spagat 的深入探讨,以使这一点看起来似是而非。

【讨论】:

以上是关于访问令牌不包括 Identity Server 4 中声明的范围的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法撤销另一个用户的访问令牌并结束他们在 Identity Server 4 中的会话?

JWT 不记名令牌不适用于 ASP.Net Core 3.1 + Identity Server 4

Identity Server4学习系列四之用户名密码获得访问令牌

Identity Server 4 没有可用于令牌的安全令牌验证器

如何撤销存储在 Identity Server 数据库中的 asp net core 中的刷新令牌

令牌服务器上自定义端点的 Identity Server 4 客户端凭据