从没有范围的 Identity Server 4 请求 API 资源
Requesting an API resource from Identity Server 4 without scopes
我正在尝试使用 Identity Server 4 中的 API 资源,我认为一定有一些我不理解的地方。
我有一个 SPA 客户端应用程序,它需要通过 IdP 对用户进行身份验证,然后代表该用户向 API 资源发出授权请求。 API 没有范围,所以我在 Identity Server 中定义了一些与 API 资源关联的 API 声明,但没有为该资源定义任何范围或范围声明。
但是,我现在对如何在 OIDC 流程中请求访问此 API 资源感到困惑。通常我会在授权请求中使用范围,但在这种情况下我没有要使用的范围。所以在我的 IProfileService
实现中,当我构建对 return 的声明时,context.RequestedResources.ApiResources
是空的。
那么,请求提供对无作用域 API 资源的访问权限的令牌的正确过程是什么?我很确定我在这里遗漏了一些基本知识,我将摆脱这种谦虚和看起来很愚蠢的状态。但是他们说没有愚蠢的问题,对吧?
范围是资源(部分)功能的逻辑名称。因此,没有范围的资源意味着该资源没有功能。这就是为什么资源应该至少有一个范围。当客户端请求范围时,它实际上是在请求某项功能。
这也是documented,虽然不是很明显。以下行实际上创建了范围为 api1
.
的资源 api1
new ApiResource("api1", "My API")
这就是文档中令人困惑的部分,资源和范围具有相同的名称:api1
.
当您向下滚动到 client configuration 时,使用 scope:
AllowedScopes = { "api1" }
但在 api configuration 中是 资源名称:
options.Audience = "api1";
换句话说,范围为 api1
的资源 api1
。
这是如何工作的,客户端请求链接到资源(受众)的范围。观众与请求的范围一起设置在令牌中(以允许在资源内进行更细粒度的授权,例如,当实现多个范围时)。该资源验证受众是否匹配,并具有按请求范围过滤的策略。当客户端没有请求任何范围时,根据规范请求为客户端配置的所有范围。
所以资源至少有一个作用域是必要的。上面的代码显示了如何为 InMemory 配置执行此操作。对于数据库配置,请确保将范围添加到 ApiScopes
table 以引用 ApiResources
table.
中的资源
从 4.0.2 开始,还必须定义 ApiScopes。我花了几个小时试图弄清楚。例如,使用 InMemory 定义 ApiResources、ApiScopes 和客户端。否则,将不会为 api 资源定义范围。
我正在尝试使用 Identity Server 4 中的 API 资源,我认为一定有一些我不理解的地方。
我有一个 SPA 客户端应用程序,它需要通过 IdP 对用户进行身份验证,然后代表该用户向 API 资源发出授权请求。 API 没有范围,所以我在 Identity Server 中定义了一些与 API 资源关联的 API 声明,但没有为该资源定义任何范围或范围声明。
但是,我现在对如何在 OIDC 流程中请求访问此 API 资源感到困惑。通常我会在授权请求中使用范围,但在这种情况下我没有要使用的范围。所以在我的 IProfileService
实现中,当我构建对 return 的声明时,context.RequestedResources.ApiResources
是空的。
那么,请求提供对无作用域 API 资源的访问权限的令牌的正确过程是什么?我很确定我在这里遗漏了一些基本知识,我将摆脱这种谦虚和看起来很愚蠢的状态。但是他们说没有愚蠢的问题,对吧?
范围是资源(部分)功能的逻辑名称。因此,没有范围的资源意味着该资源没有功能。这就是为什么资源应该至少有一个范围。当客户端请求范围时,它实际上是在请求某项功能。
这也是documented,虽然不是很明显。以下行实际上创建了范围为 api1
.
api1
new ApiResource("api1", "My API")
这就是文档中令人困惑的部分,资源和范围具有相同的名称:api1
.
当您向下滚动到 client configuration 时,使用 scope:
AllowedScopes = { "api1" }
但在 api configuration 中是 资源名称:
options.Audience = "api1";
换句话说,范围为 api1
的资源 api1
。
这是如何工作的,客户端请求链接到资源(受众)的范围。观众与请求的范围一起设置在令牌中(以允许在资源内进行更细粒度的授权,例如,当实现多个范围时)。该资源验证受众是否匹配,并具有按请求范围过滤的策略。当客户端没有请求任何范围时,根据规范请求为客户端配置的所有范围。
所以资源至少有一个作用域是必要的。上面的代码显示了如何为 InMemory 配置执行此操作。对于数据库配置,请确保将范围添加到 ApiScopes
table 以引用 ApiResources
table.
从 4.0.2 开始,还必须定义 ApiScopes。我花了几个小时试图弄清楚。例如,使用 InMemory 定义 ApiResources、ApiScopes 和客户端。否则,将不会为 api 资源定义范围。