You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多容器Azure App Service无法通过托管标识访问Cosmos NoSQL

多容器Azure App Service无法通过托管标识访问CosmosDB排查解决

环境与配置

  • 多容器应用通过Docker Compose部署在Azure App Service,已分配用户分配托管标识
  • 已执行以下命令为标识授予Cosmos容器RBAC权限:
    az cosmosdb sql role assignment create -a cosmos-nosql-db -g rish90-rg-westus -s "/" -p actual_principal_id -d 00000000-0000-0000-0000-000000000002
  • 应用包含Nginx代理、Nginx HTTP服务器、.NET后端服务,后端通过DefaultAzureCredential与CosmosDB通信
  • 相关代码仓库:TodoApi-SingleNode-MultiContainer-App
  • 系统架构:Nginx代理 → Nginx HTTP服务器 → .NET后端 → CosmosDB

问题现象

  • 多容器部署时,后端无法访问CosmosDB,报错:
    Azure.Identity.CredentialUnavailableException: DefaultAzureCredential failed to retrieve a token from the included credentials.
  • 将后端单独部署为单容器Azure App Service,启用相同托管标识并配置RBAC后,可正常访问CosmosDB

可能的原因及解决方法

  • 检查托管标识的容器注入配置
    Azure App Service多容器部署中,托管标识默认仅注入到docker-compose.yml中标注为web的服务。若.NET后端不是web服务,标识不会被自动注入。
    解决:在后端服务的docker-compose.yml配置中添加labels: com.microsoft.azure.app-service.managed-identity: "true",强制为该容器注入托管标识;或调整架构让web服务指向.NET后端(若业务允许)。

  • 验证容器内的标识元数据访问
    进入.NET后端容器,执行以下命令测试是否能获取标识token:
    curl http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fcosmos.azure.com -H "Metadata: true"

    • 若返回404或无响应:说明标识未注入容器,需调整上述容器配置;
    • 若成功获取token:检查token的aud字段是否为https://cosmos.azure.com,同时确认RBAC角色分配的主体ID是用户分配标识的Object ID(而非Client ID)。
  • 显式指定DefaultAzureCredential的托管标识Client ID
    多容器环境中,DefaultAzureCredential可能会尝试多个 credential 源导致选择错误,建议显式指定用户分配标识的Client ID:

using Azure.Identity;

var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = "你的用户分配标识Client ID"
});
  • 确认容器网络对元数据服务的访问权限
    确保.NET后端容器能访问Azure实例元数据服务(169.254.169.254),检查Nginx代理是否拦截了该地址的请求。默认bridge网络无需额外配置,若使用自定义网络需确认路由规则允许访问该地址。

  • 核对RBAC角色分配的准确性
    执行以下命令列出当前CosmosDB的角色分配,确认细节:
    az cosmosdb sql role assignment list -a cosmos-nosql-db -g rish90-rg-westus
    需验证:

    • 角色分配的主体ID与用户分配托管标识的Object ID完全一致;
    • 角色定义ID(00000000-0000-0000-0000-000000000002)对应正确的权限角色(即Cosmos DB内置数据贡献者角色)。

内容的提问来源于stack exchange,提问作者Rishi Prakash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 14:15:56