首页 > 解决方案 > DefaultAzureCredential 不适用于 Azure 应用服务中的用户分配的托管标识,而 Azure VMSS 则不然

问题描述

为 Azure VMSS 和 Azure 函数应用启用了相同的“用户分配的托管标识”。

将 MI 添加到 Azure 密钥保管库的访问策略。

在以下应用程序主机上,使用“DefaultAzureCredential”尝试连接到 Azure 密钥保管库以读取应用程序机密,

  1. 从部署在 Azure VMSS 上的应用程序,可以毫不费力地连接到 Azure 密钥保管库,以使用“DefaultAzureCredential”api 读取应用程序机密

  2. 在 Azure 函数无法使用“DefaultAzureCredential”api 连接到 keyvault 的情况下,它会引发以下异常

    Error occurred while trying to connect to Key Vault. Azure.Identity: 
    ManagedIdentityCredential authentication failed: Service request 
    failed. Status: 400 (Bad Request)
    

通过在 appsettings 中添加显式“AZURE_CLIENT_ID”变量并为其分配“用户分配的托管标识”名称来克服 Azure 函数应用中的上述问题。

想知道,为什么在需要明确提及“AZURE_CLIENT_ID”的 Azure VMSS 与 Azure 函数应用程序中使用“DefaultAzureCredential”api 时,它的行为会有所不同?这里的理由是什么?

PS:上面提到的仅发生在用户分配而不是系统分配的托管标识中。

标签: azureazure-functionsazure-keyvaultazure-vm-scale-setdefaultazurecredential

解决方案


这不是身份的问题,而是请求的问题。HTTP 400 表示提交到 Key Vault 的令牌有问题。如果这是 403,那么它会因为访问策略而被拒绝。

此外,在使用用户分配的身份时,您始终必须明确说明要使用的身份。这就是它起作用的原因。

===其他信息===

https://docs.microsoft.com/en-us/azure/app-service/overview-managed-identity?tabs=dotnet#add-a-user-assigned-identity

如果要使用用户分配的托管标识,可以将 AzureServicesAuthConnectionString 应用程序设置设置为 RunAs=App;AppId=。替换为您要使用的身份的客户端 ID。

此外,还有以下信息:

client_id 要使用的用户分配身份的客户端 ID。不能用于包含 principal_id、mi_res_id 或 object_id 的请求。如果省略所有 ID 参数(client_id、principal_id、object_id 和 mi_res_id),则使用系统分配的身份。

综上所述,我需要确切了解您如何设置所有这些以使用户分配的身份正常工作。问题在于用户分配的身份是您可以创建许多身份,因此必须明确告知每个服务应该使用哪一个。系统分配的身份不是这种情况,因为每个服务只有一个 - 如果您不告诉服务使用特定的用户分配的身份,它会假定您需要系统分配的身份。


推荐阅读