如何在不同的Azure租户之间获取令牌?

问题描述 投票:0回答:1

我的用户帐户和我朋友的 API 都位于同一个 Azure 租户(假设租户 A)。

我的用户帐户有权从该 API 请求数据;我可以使用创建一个公共客户端应用程序并使用 AcquireTokenInteractive 来获取令牌;但我需要在浏览器中单击我的用户帐户才能获取令牌。

现在我想在我的个人租户上开发一个虚拟主机(我的用户帐户是该租户的管理员,假设租户 B)。

我最初的计划是,其他最终用户与租户 B 上的我的 Web 服务主机交互,然后我的 Web 服务使用我的用户帐户的令牌从租户 A 上朋友的 API 主机获取数据。

问题在于,一旦我在 Azure 上发布了我的项目,我就无法与浏览器进行交互并获取令牌。

我尝试寻找解决方法:

  1. 使用刷新令牌。但我相信这至少需要一次用户交互式登录,这对我来说是不可能的。
  2. 经管理员同意的应用程序权限。这需要租户 B 管理员的批准,但目前我无法批准。
  3. 在本地服务器上运行 Web 应用程序,然后使用 ngrok 向其他用户公开。

如有任何意见或建议,我们将不胜感激。

azure azure-active-directory azure-ad-msal
1个回答
0
投票

要在不同租户之间获取令牌,请确保创建多租户应用程序,其帐户类型如下:

enter image description here

在此应用程序中,我公开了一个 API 并添加了名为

Files.Read
的新自定义范围:

enter image description here

确保使用权限作为

/common
端点,并在获取令牌时选择来自不同租户的用户进行登录。

在我的例子中,我使用下面的示例 python 代码来使用交互式流程获取令牌:

import msal
client_id = 'appId'
authority = f"https://login.microsoftonline.com/common"
scope = ["api://appId/Files.Read"]  # Modify scope if needed

app = msal.PublicClientApplication(client_id, authority=authority)
result = app.acquire_token_interactive(scopes=scope)

if "access_token" in result:
    print("Access Token:", result['access_token'])
else:
    print("Failed to acquire token:", result.get("error"), result.get("error_description"))

运行上述代码将要求用户使用

/common
端点选择一个帐户,您也可以从其他租户中选择任何帐户:

enter image description here

身份验证成功后,您将在response中获得访问令牌,如下所示:

enter image description here

您可以通过将访问令牌粘贴到 jwt.ms 网站来对其进行解码,并检查

iss
tid
声明以区分登录用户:

来自相同租户的登录用户的令牌:

enter image description here

来自不同租户的登录用户的令牌:

enter image description here

请注意,委托流程在获取代币时必须至少与用户交互一次,没有其他可能的方法。

© www.soinside.com 2019 - 2024. All rights reserved.