首页 > 解决方案 > IdentityServer4 - 客户端的委托访问令牌

问题描述

在 IdentityServer4 中,您可以指定一个扩展 grand来为用户启用委托访问令牌,因此如果 Web 服务需要在用户请求期间调用另一个 Web 服务,它可以从 IdentityServer 请求具有有效范围和受众的新访问令牌。我的问题是,这个授权被认为是“代表交互式用户”使用的,这导致了我的问题:

如果我的客户端调用了需要在请求期间调用另一个 Web 服务的 Web 服务,我该如何创建委托访问令牌?

我试图修改文档中的示例,但扩展 Grand 期望来自用户的令牌,该用户持有“sub”声明,而不是来自不持有“sub”声明的客户端。

客户端是一个守护程序应用程序,因此它完全自动化运行,无需任何用户交互,并通过客户端凭据流进行身份验证。

为了澄清我的意思:

在这里,我们看到一个用例,如果用户在场: 如果用户在场,则流程

  1. 用户访问 UI
  2. UI 将用户重定向到身份服务器进行身份验证(使用授权代码流程 + PCKE)。UI 取回访问令牌
  3. UI 使用访问令牌调用 WebApi A
  4. WebApi A 需要访问 WebApi B,但访问令牌是为 WebApi A 准备的。因此,WebApi A 向 IdentityServer 请求授权访问令牌以访问 WebApi B。
  5. IdentityServer 提供委托的访问令牌。
  6. 新的访问令牌被传递给 WebApi B。

在这里,我们看到了相同的用例,但没有用户存在,并且守护程序应用程序执行相同的操作:

如果没有用户在场,则流

  1. 守护程序应用程序使用客户端凭据流对 IdentityServer 进行身份验证并取回访问令牌
  2. 守护程序应用程序使用访问令牌调用 WebApi A
  3. WebApi A 需要访问 WebApi B,但访问令牌是为 WebApi A 准备的。因此,WebApi A 向 IdentityServer 请求授权访问令牌以访问 WebApi B。
  4. 如何让 IdentityServer 为客户端提供委托的访问令牌?
  5. 新的访问令牌被传递给 WebApi B。

标签: c#oauthoauth-2.0identityserver4openid-connect

解决方案


对于机器到机器(服务到服务)通信,您通常使用客户端凭据授权。即使没有用户在场,这也允许服务进行通信。用户 ID(主题)通常包含在使用此流程保护的 API 调用中。

看这篇文章

WebApi-A 和 WebApi-B 之间的通信可以使用客户端凭据流完成,在这里您不需要从用户传递任何访问令牌。相反,您传递 subjectId(userID) 和可选的一些附加声明作为 A 和 B 之间 API 调用的一部分。这种方式更简单,好处是 AB 可以在没有任何用户参与的情况下进行通信(例如,在的背景)。


推荐阅读