首页 > 解决方案 > 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 的文档,此错误可能有多种原因:

在尝试了解有关 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 通信。

标签: azureoauth-2.0jwtopenid-connect

解决方案


推荐阅读