从没有范围的 Identity Server 4 请求 API 资源

get*_*ode 2 asp.net openid-connect identityserver4

我正在尝试使用 Identity Server 4 中的 API 资源,并认为一定有我不理解的地方。

我有一个 SPA 客户端应用程序,它需要通过 IdP 对用户进行身份验证,然后代表该用户向 API 资源发出授权请求。API 没有作用域,所以我在 Identity Server 中定义了一些与 API 资源相关的 API 声明,但没有费心为此资源定义任何作用域或作用域声明。

但是,我现在对如何请求访问此 API 资源作为 OIDC 流程的一部分感到困惑。通常我会在授权请求中使用范围,但在这种情况下我没有范围可以使用。所以在我的 实现中IProfileService,当我构建返回的声明时,它context.RequestedResources.ApiResources是空的。

那么,请求提供对无作用域 API 资源的访问的令牌的正确流程是什么?我很确定我在这里遗漏了一些基本的知识,我将摆脱这种谦虚和愚蠢的态度。但是他们说没有愚蠢的问题,对吧?

小智 6

范围是资源(部分)功能的逻辑名称。因此,没有范围的资源意味着该资源没有功能。这就是为什么资源应该至少有一个范围。当客户端请求某个范围时,它实际上请求某个功能。

这也有记录,尽管不是很明显。api1以下行实际上创建了具有scope的资源api1

new ApiResource("api1", "My API")
Run Code Online (Sandbox Code Playgroud)

这是文档中令人困惑的部分,资源和范围具有相同的名称:api1

当您向下滚动到客户端配置时将使用范围:

AllowedScopes = { "api1" }
Run Code Online (Sandbox Code Playgroud)

但在api 配置中它是资源名称

options.Audience = "api1";
Run Code Online (Sandbox Code Playgroud)

换句话说,api1具有范围的资源api1

这是如何工作的,客户端请求链接到资源(受众)的范围。受众与请求的范围一起在令牌中设置(以允许资源内更细粒度的授权,例如,当实现多个范围时)。资源验证受众是否匹配,并具有按请求范围进行过滤的策略。当客户端没有请求范围时,根据规范,将请求为客户端配置的所有范围。

因此,资源至少有一个范围是必要的。上面的代码展示了如何针对 InMemory 配置执行此操作。对于数据库配置,请确保向ApiScopes表中添加引用表中资源的范围ApiResources


小智 5

从 4.0.2 开始,也必须定义 ApiScopes。我花了几个小时试图弄清楚这一点。例如,使用 InMemory 定义 ApiResources、ApiScopes 和客户端。否则,将不会为 api 资源定义范围。