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

时间:2021-07-24 15:01:00

标签: c# identityserver4 access-token

大致遵循 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 范围。使用刷新令牌请求新令牌时也是如此。 body中传递的payload如下所示。我尝试在没有指定 范围 的情况下获取所有支持的令牌(如承诺的 in the docs),但没有成功。

<块引用>

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

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

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

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

1 个答案:

答案 0 :(得分:0)

不太喜欢回答我自己的问题,但有时需要这样做。

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

<块引用>

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

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


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

<块引用>

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

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