在 Azure Functions (Python) 中将图形 API 与系统分配的托管标识结合使用

Use Graph API with System Assigned Managed Identity in Azure Function (Python)

我已经通过以下指南成功地将应用程序权限添加到我的系统分配的托管 Identity/Service principal/MSI(企业应用程序)连接到 Azure 函数。

https://gist.githubusercontent.com/JanVidarElven/32b8f6bb8a422c9cce1816582eef24d8/raw/1148f1a96a351acf1a0fcf282e187ef1d2398fb1/AddManagedIdentityMSGraphAppRoles.md

我之前使用过单独创建的应用程序 registration/Enterprise 应用程序,并使用其中的秘密获取令牌,以便在向 Microsoft Graph API 发送请求时使用。

def get_auth_token_appreg(secret):
app = msal.ConfidentialClientApplication(appreg_client_id, authority=appreg_tenant_id, client_credential=secret)

result = None
result = app.acquire_token_silent(default_scope, account=None)

if not result:
    result = app.acquire_token_for_client(default_scope)

return result["access_token"]

我不知道如何(如果可能的话)在不使用 Python 中的应用程序注册密码的情况下使用此 MSI。由于没有应用程序注册,我什至不确定我无法获得此 MSI 的秘密。我不想使用秘密,而是使用 MSI(具有它的权限),因为秘密有点违背了向 MSI 添加权限的目的。

有什么想法吗?

在评论中的一些帮助下得到它的工作。

为托管身份添加权限,如果您将应用程序类型更改为托管身份,则可以在企业应用的列表中找到它。

Powershell 添加权限指南:

https://gist.githubusercontent.com/JanVidarElven/32b8f6bb8a422c9cce1816582eef24d8/raw/1148f1a96a351acf1a0fcf282e187ef1d2398fb1/AddManagedIdentityMSGraphAppRoles.md

Python 发行令牌的代码:

default_scope = "https://graph.microsoft.com/.default"

def get_token():
credential = DefaultAzureCredential()
token = credential.get_token(default_scope)
return token[0]

确保颁发的令牌具有正确的 roles/permissions。您可以使用 https://jwt.ms/ 检查令牌。