如何正确使用azure身份的“ManagedIdentityCredential”的“get_token”

der*_*rek 3 python-3.x azure-active-directory azure-ad-msal azure-managed-identity

我正在尝试使用 Azure 功能的托管标识来访问 AAD 保护的 Web 应用程序,这需要自定义流程而不是使用不同的客户端。所以第一步是获取访问令牌:

credential = DefaultAzureCredential()
scope = "https://graph.microsoft.com/.default"
token = credential.get_token(scope)
Run Code Online (Sandbox Code Playgroud)

我能够成功获得令牌。

然后访问受 AAD 保护的 Web 应用程序:

uri = "https://my-web-app-1.azurewebsites.net/"
headers = {
    'Authorization': 'Bearer ' + token.token
}
api_response = requests.get(uri, headers=headers)
Run Code Online (Sandbox Code Playgroud)

但是,这一步会返回错误:

{“code”:401,“message”:“IDX10511:签名验证失败。尝试的密钥:'[PII 被隐藏]'。\nkid:'[PII 被隐藏]'。\n捕获的异常:\n '[PII 是隐藏]'。\n令牌:'[PII 已隐藏]'。"}

所以我怀疑我使用了错误的范围来获取令牌。所以我很困惑在这里使用哪个范围?

- - - 语境 - - -

我有一个天蓝色功能,已启用系统身份,已启用该功能来访问我的网络应用程序my-web-app-1.azurewebsites.net/。Web 应用程序my-web-app-1.azurewebsites.net/受 AAD 保护。

以下是我用于 Web 应用程序身份验证的 AAD 应用程序下的 API 权限。这里的错误是我为W​​eb应用程序而不是Azure函数设置了API权限,以防万一无法设置(因为函数具有系统身份,而不是AAD应用程序,我们可以在其中设置API权限。)

在此输入图像描述

unk*_*own 5

尝试设置scope{your-api-client-id}/.default获取访问令牌。将 your-api-client-id 替换为 Azure AD 中 API 应用程序的客户端 ID/应用程序 ID。

在此输入图像描述