`az account get-access-token --resource api://<appid>` 如何在幕后工作以检索访问令牌?

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

考虑以下尝试检索访问令牌的命令:

az account get-access-token --resource api://<appid>

如果 Azure CLI 是预授权的客户端应用程序,则此方法有效:

04b07795-8ddb-461a-bbee-02f9e1bf7b46

但是这个命令在幕后是如何工作的呢?我认为 Azure CLI 应用程序对我的应用程序没有权限(范围),因此这不是一个选项。另外,我不相信它正在执行 OAuth 2.0 代表流程,因为在这种情况下中间层 API 是什么?

谢谢!

azure security azure-active-directory microsoft-entra-id azure-entra-id
1个回答
0
投票

这是一个很好的问题——我发现 Entra auth(以前的 Azure Active Directory——AAD)一度令人困惑。你的观点有点乱:


az account get-access-token
如何运作?

[

az account get-access-token --resource api://<appid>
]在幕后是如何运作的?

这是一个有点宽泛的问题:

为了我们的目的,Entra 授权 通过生成可用于通过 Azure 应用程序进行身份验证的安全令牌来工作 (它是 OAuth 2 和 OpenID 连接在 场景)。特别是,您使用 MSAL 身份验证以生成访问令牌 范围 特定 Azure 应用程序注册,您可以使用您使用的 API 进行身份验证和授权(“auth”) 调用(在其代码中,API 验证对其受保护 URI 的调用是否包含具有这些范围的承载令牌 [示例代码])。

但我认为您已经明白这一点了——关键是 Azure CLI 是这些应用程序/范围的公共客户端

它使用什么身份验证流程?

另外,我不相信它正在执行 OAuth 2.0 代表流程,因为在这种情况下中间层 API 是什么?

特别是,您在这里是正确的——公共客户端不能执行OAuth 2.0代表身份验证。但这是一种误导——大多数 Entra 应用程序doauth“代表”用户。它只是不涉及特定的“代表”流程,该流程特定于“服务到服务”调用

相反,Azure CLI 是一个 代表登录用户调用 Web API 的桌面应用程序,它可以使用许多支持的身份验证流程。大多数时候我相信它使用auth代码流程(Rukmini对你的问题的评论有更多细节),它使用OAuth2.0授权代码流程。 Azure CLI:

  1. 请求授权码(打开浏览器窗口),通过重定向 URI 接收它,并将其兑换为访问令牌
  2. 返回该访问令牌供您使用。

无需中间层API!

它使用哪些凭据?

谢谢,但是它使用哪些凭据来获取访问令牌?我的凭据?

身份验证代码流程不会直接处理您的凭据:它通常在浏览器中打开一个身份验证流程(可选地仅限于特定租户/一组租户),然后使用该登录流程的结果来获取您范围的访问令牌。

所以,是的,它使用您的凭据,但不是直接使用:只有 Microsoft 才能看到这些凭据。

它如何访问我的示波器?

我认为 Azure CLI 应用程序对我的应用程序没有权限(范围),因此这不是一个选项。

我认为这是不正确的:您已明确授予 Azure CLI 访问您的应用程序的权限(代表用户)。

就像您在问题中提到的那样,您已添加了 Azure CLI (

04b07795-8ddb-461a-bbee-02f9e1bf7b46
) 作为授权客户端应用程序:

authorized client application

在该授权中,您授予其访问特定范围的权限:

authorized scopes

这样,我就可以使用 Azure CLI 访问我的资源:

az account get-access-token --scope "api://my_app_id_guid/TestScope"
# => access token, etc

您的应用程序注册授予Azure CLI的应用程序注册访问权限; Azure CLI 端无需配置。

这适用于任意 API 吗?

此外,它如何获得任意API的访问令牌?通常,这需要在客户端上配置范围?但是,Azure CLI 自然无法为任何资源配置范围

由于 Azure CLI 被添加为预授权客户端,这意味着用户(我)不会收到同意提示,它可能不支持,因为它是 CLI。

任何应用程序注册都可以允许 Azure CLI 访问其范围——只需授予访问权限,如上所述。但如果没有授予该访问权限,Azure CLI 就无法访问任意 API。关键是应用程序注册授予对 Azure CLI 的访问权限,而不是 Azure CLI 向应用程序注册请求权限。

这就是为什么我无法使用 Azure CLI 获取 Azure 中所有 API 的令牌。


希望有帮助!

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