如何正确使用"get_token" of "ManagedIdentityCredential" of azure identity

How to properly use "get_token" of "ManagedIdentityCredential" of azure identity

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

credential = DefaultAzureCredential()
scope = "https://graph.microsoft.com/.default"
token = credential.get_token(scope)

我可以成功拿到token了

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

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

但是,这一步returns错误:

{"code":401,"message":"IDX10511: Signature validation failed. Keys tried: '[PII is hidden]'. \nkid: '[PII is hidden]'. \nExceptions caught:\n '[PII is hidden]'.\ntoken: '[PII is hidden]'."}

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

------上下文-----

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

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

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