azure - Azure Active Directory 是否支持 JWT 不记名令牌流?
问题描述
我们有许多服务可供用户通过基于 HTTP 的协议 (SOAP/REST/WebDAV) 调用。这些服务支持各种身份验证机制(例如基本和 OIDC 承载令牌)。有时,一个服务必须在没有实时用户的情况下调用另一个服务。为此,我们配置技术用户,服务 A 可以使用技术用户的凭据调用 B。
对于通过承载令牌进行的 OAuth/OIDC 身份验证,我们使用 JWT 承载令牌流为我们的技术用户获取访问令牌:服务 A 使用技术用户的名称创建一个 JWT,并使用自己的私钥对其进行签名。然后,它使用该令牌调用 OIDC 令牌端点并接收其技术用户 X 的访问令牌。然后,它可以将此令牌用作承载令牌来调用服务 B,该服务 B 将接受用户 X 的令牌。(有关更多信息JWT 承载流,参见 RFC 7523 第 2.1 节和 RFC 7521 第 4 节)。
这适用于我们的 Connect2id 测试服务器和 Salesforce,但我们无法让它与 Azure 一起使用。访问 Azure 的令牌端点总是会导致以下错误响应:
AADSTS50027:JWT 令牌无效或格式错误
根据 Microsoft 的文档,此错误可能有多种原因:
- 不包含 nonce 声明、子声明
- 主题标识符不匹配
- idToken 声明中的重复声明
- 意外的发行人
- 意想不到的观众
- 不在其有效时间范围内
- 令牌格式不正确
- 来自发行者的外部 ID 令牌签名验证失败。
在尝试了解有关 Azure 和 JWT 承载流的更多信息时,我能够找到的唯一可靠信息是这篇文章: https ://docs.microsoft.com/en-us/azure/active-directory/develop /v2-oauth2-代表流
它描述了“代表”(OBO) 流,据我所知,它是 JWT 承载流的扩展(由微软?),在混合中添加了第二个 JWT 以及一个名为“requested_token_use”的参数设置为“on_behalf_of”。我只能找到与特殊 OBO 流程相关的“requested_token_use”,它的唯一值似乎是“on_behalf_of”。
OBO 流不是我们想要的,因为它似乎允许服务 X 将服务 Y 接收到的令牌转换为另一个令牌,使用 Y 令牌和自生成的 X 令牌来调用令牌端点。我们的用例只有一个自行生成的 X 令牌和允许该应用模拟的用户的名称。
经过漫长的试错阶段,我们得出的印象是 OBO 实际上可能是 Azure 知道的唯一(非标准)JWT 承载流版本,并且它可能不支持“正常”的 JWT 承载我们正在尝试使用的流程。这是正确的吗,我们别无选择,只能在涉及 Azure 时放弃尝试使用标准 OIDC 解决这种情况,或者 Azure 实际上是否也支持我们已经实现的流程,而我们只是做错了什么(例如错误我们的 JWT 中的受众或发行者,还是 Azure 中配置错误的应用程序)?
PS:我们的代码是用 Java 编写的,我们使用 Nimbus 库进行 OAuth/OIDC 通信。
解决方案
推荐阅读
- postscript - 保存到 postscript 时符号显示不正确
- sql - CTE 与子查询
- sql - 动态调整选择字段 - PostgreSQL
- unreal-engine4 - Unreal 4.25 - 在画布上绘制文本不会刷新
- javascript - 最少的硬币,仅使用条件语句
- mysql - 如何获取外键的属性
- f# - 为非本地收件人丢弃消息 [Akka.Actor.ActorSelectionMessage]
- python - 非二叉树遍历方法
- node.js - Firebase 函数:shell < test.js 示例
- python - 如何使用循环为变量分配新值以确保没有重复值?