如何使用 MSAL.js 为 Azure DevOps 获取有效的 AAD v2 令牌

X. *_* Ou 2 azure jwt azure-active-directory azure-ad-msal azure-devops-rest-api

ADAL.js 和 AAD v1 可以使用委派的 user_impersonation 范围访问 Azure DevOps。

我使用具有委托权限的相同 AAD 应用程序 ID 来使用 MSAL.js 生成访问令牌。令牌已成功创建,但访问令牌无法访问 Azure DevOps。

解码后的 JWT 令牌中唯一有意义的区别是“aud”声明不同。

在 ADAL/v1 中,aud 是 Azure DevOps 的应用程序 ID:

"aud": "499b84ac-1321-427f-aa17-267ca6975798"
Run Code Online (Sandbox Code Playgroud)

在 MSAL/v1 中,aud 是 Azure DevOps 的唯一 uri:

"aud": "https://app.vssps.visualstudio.com"
Run Code Online (Sandbox Code Playgroud)

有没有人能够使用具有 user_impersonation 委派权限的 MSAL.js 来访问 Azure DevOps rest API?如果是这样,是否缺少让 MSAL 工作的东西?

他们的 JWT 验证是否可能还没有考虑到第二个受众价值?

X. *_* Ou 9

看起来 Azure DevOps 是一个 v1.0 应用程序,所以我试图让它与 Azure 门户在设置委派权限时建议的错误 v2.0 范围一起工作:

scopes: ['https://app.vssps.visualstudio.com/user_impersonation']
Run Code Online (Sandbox Code Playgroud)

但是,根据这个doc,在与 v1.0 应用程序交谈时,范围应该使用资源 Id 作为前缀。以下是 Azure DevOps 资源 ID 的工作范围:

scopes: ['499b84ac-1321-427f-aa17-267ca6975798/user_impersonation']
Run Code Online (Sandbox Code Playgroud)

这解决了 aud 字段的问题,因此我再次拥有 499b84ac-1321-427f-aa17-267ca6975798 的 JWT aud 声明。

希望这可以帮助其他人阻止此问题。

  • 谢谢,这在 2022 年仍然是一个问题,并且您的解决方案非常有效。 (2认同)