c# - IdentityServer4 - 客户端的委托访问令牌
问题描述
在 IdentityServer4 中,您可以指定一个扩展 grand来为用户启用委托访问令牌,因此如果 Web 服务需要在用户请求期间调用另一个 Web 服务,它可以从 IdentityServer 请求具有有效范围和受众的新访问令牌。我的问题是,这个授权被认为是“代表交互式用户”使用的,这导致了我的问题:
如果我的客户端调用了需要在请求期间调用另一个 Web 服务的 Web 服务,我该如何创建委托访问令牌?
我试图修改文档中的示例,但扩展 Grand 期望来自用户的令牌,该用户持有“sub”声明,而不是来自不持有“sub”声明的客户端。
客户端是一个守护程序应用程序,因此它完全自动化运行,无需任何用户交互,并通过客户端凭据流进行身份验证。
为了澄清我的意思:
- 用户访问 UI
- UI 将用户重定向到身份服务器进行身份验证(使用授权代码流程 + PCKE)。UI 取回访问令牌
- UI 使用访问令牌调用 WebApi A
- WebApi A 需要访问 WebApi B,但访问令牌是为 WebApi A 准备的。因此,WebApi A 向 IdentityServer 请求授权访问令牌以访问 WebApi B。
- IdentityServer 提供委托的访问令牌。
- 新的访问令牌被传递给 WebApi B。
在这里,我们看到了相同的用例,但没有用户存在,并且守护程序应用程序执行相同的操作:
- 守护程序应用程序使用客户端凭据流对 IdentityServer 进行身份验证并取回访问令牌
- 守护程序应用程序使用访问令牌调用 WebApi A
- WebApi A 需要访问 WebApi B,但访问令牌是为 WebApi A 准备的。因此,WebApi A 向 IdentityServer 请求授权访问令牌以访问 WebApi B。
- 如何让 IdentityServer 为客户端提供委托的访问令牌?
- 新的访问令牌被传递给 WebApi B。
解决方案
对于机器到机器(服务到服务)通信,您通常使用客户端凭据授权。即使没有用户在场,这也允许服务进行通信。用户 ID(主题)通常包含在使用此流程保护的 API 调用中。
看这篇文章
WebApi-A 和 WebApi-B 之间的通信可以使用客户端凭据流完成,在这里您不需要从用户传递任何访问令牌。相反,您传递 subjectId(userID) 和可选的一些附加声明作为 A 和 B 之间 API 调用的一部分。这种方式更简单,好处是 AB 可以在没有任何用户参与的情况下进行通信(例如,在的背景)。
推荐阅读
- linux - 捕获 X11/GTK+ 键盘快捷键事件 - 更改桌面/工作区
- pyspark - Pyspark:比较RDD的元素
- ssl - Tomcat 使用 SSL 从 www 重写为 no-www
- python - 重玩功能仅在用户输掉游戏时才起作用(刽子手)
- .net - 带有 SQS/SNS 的 MassTransit。消息未发布到 SQS 队列
- javascript - 为什么在类的异步函数之后不执行代码?
- c++ - 如何让 QMessageBox 删除向量的内容
- python - 如何使用漂亮的汤从实时网站记录数据
- ceph - 如何在 Ceph 集群中重启 Mon
- ansible - 如何检查 Ansible 的 resolv.conf 文件中是否存在 DNS 条目