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

如何为存储账户列表启用AAD认证?托管身份认证失败求助

解决App Service托管身份下DefaultAzureCredential+ArmClient认证失败问题

1. 确认托管身份的权限范围与角色

  • 必须为App Service的托管身份分配订阅级别的「存储账户读取者」或「读者」角色,因为要列出订阅下所有存储账户,资源组级别的权限无法覆盖全订阅范围。
  • 验证角色分配:进入Azure门户→目标订阅→「访问控制(IAM)」→「角色分配」,搜索你的App Service名称(系统分配身份的名称与App Service名一致),确认角色和范围(订阅)正确。注意角色分配可能需要5-10分钟生效,不要刚配置就测试。

2. 简化ArmClient初始化代码

确保代码没有多余配置,让DefaultAzureCredential自动适配App Service托管身份:

using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Storage;

var credential = new DefaultAzureCredential();
var armClient = new ArmClient(credential);
// 从App Service配置中读取订阅ID
var subscriptionId = Environment.GetEnvironmentVariable("AZURE_SUBSCRIPTION_ID");

// 列出订阅下所有存储账户
var storageAccountCollection = armClient.GetStorageAccounts();
var storageAccounts = storageAccountCollection.ListBySubscription(subscriptionId);

foreach (var account in storageAccounts)
{
    Console.WriteLine(account.Data.Name);
}

3. 排查认证路径(添加日志)

添加Azure.Identity的日志,确认DefaultAzureCredential是否在使用托管身份:

using Azure.Core.Diagnostics;

// 在Program.cs开头添加日志监听
using var listener = AzureEventSourceListener.CreateConsoleLogger();

// 后续的认证和ArmClient代码不变

部署后查看App Service的「日志流」,如果看到ManagedIdentityCredential相关的成功日志,说明认证路径正确;如果提示权限不足,回到第一步检查角色分配。

4. 检查App Service环境配置

  • 在App Service的「配置」→「应用程序设置」中添加AZURE_SUBSCRIPTION_ID,值为你的目标订阅ID,确保代码能读取到该变量。
  • 如果使用用户分配托管身份,需要在DefaultAzureCredential中指定身份ID:
    var options = new DefaultAzureCredentialOptions
    {
        ManagedIdentityClientId = "你的用户分配身份Client ID"
    };
    var credential = new DefaultAzureCredential(options);
    

5. 权限测试与排查

  • 临时给托管身份分配「参与者」角色(订阅级别),如果能成功列出存储账户,说明之前的角色权限不够,再切换回「存储账户读取者」;如果还是失败,排查App Service的网络隔离设置或身份启用状态。
  • 确认App Service的「身份」设置中,系统分配身份已开启(状态为「打开」)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:57:34