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

如何通过C#控制台应用使用托管标识连接Azure存储账户文件共享

实现步骤

前置准备

  • 已为目标VM配置托管标识(系统分配或用户分配均可),且已为该托管标识授予目标存储账户的存储文件数据共享贡献者权限(或更小的符合权限最小原则的自定义角色,包含文件写入权限即可)
  • 本地开发环境已安装.NET SDK(.NET Core 3.1及以上版本均可)

第一步:安装依赖NuGet包

在你的控制台项目中安装以下两个NuGet包:
包管理器控制台命令:

Install-Package Azure.Storage.Files.Shares
Install-Package Azure.Identity

dotnet CLI命令:

dotnet add package Azure.Storage.Files.Shares
dotnet add package Azure.Identity

第二步:核心实现代码

DefaultAzureCredential会自动按优先级读取可用身份凭证:部署到Azure VM时会自动读取VM绑定的托管标识,本地开发时会自动读取你在VS/VS Code/AZ CLI中登录的Azure账号凭证,无需额外修改鉴权代码。
完整代码示例:

using Azure.Identity;
using Azure.Storage.Files.Shares;
using System;
using System.IO;

namespace AzureFileUploadDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 替换为你的实际参数
            string storageAccountName = "你的存储账户名";
            string shareName = "你的文件共享名";
            string localFilePath = @"C:\本地要上传的文件路径\test.txt";
            string remoteFileName = "上传后保存的文件名.txt";
            // 如果使用用户分配的托管标识,填写对应客户端ID,系统分配的话留空即可
            string userAssignedClientId = "";

            try
            {
                // 构建文件共享的访问URI
                Uri shareUri = new Uri($"https://{storageAccountName}.file.core.windows.net/{shareName}");

                DefaultAzureCredential credential;
                if (!string.IsNullOrEmpty(userAssignedClientId))
                {
                    // 指定用户分配托管标识的客户端ID
                    credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions 
                    { 
                        ManagedIdentityClientId = userAssignedClientId 
                    });
                }
                else
                {
                    // 使用系统分配托管标识
                    credential = new DefaultAzureCredential();
                }

                // 初始化文件共享客户端
                ShareClient shareClient = new ShareClient(shareUri, credential);

                // 可选:如果需要上传到共享下的指定目录,先创建/获取目录客户端
                // ShareDirectoryClient directoryClient = shareClient.GetDirectoryClient("自定义目录名");
                // directoryClient.CreateIfNotExists();
                // ShareFileClient fileClient = directoryClient.GetFileClient(remoteFileName);

                // 直接上传到共享根目录的示例
                ShareFileClient fileClient = shareClient.GetRootDirectoryClient().GetFileClient(remoteFileName);

                // 上传文件
                using FileStream uploadFileStream = File.OpenRead(localFilePath);
                fileClient.Create(uploadFileStream.Length);
                fileClient.Upload(uploadFileStream);

                Console.WriteLine("文件上传成功");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"上传失败:{ex.Message}");
            }
        }
    }
}

常见注意事项

  • 托管标识的权限分配后存在最长15分钟的延迟,刚分配权限时如果出现鉴权失败可以稍等一会再测试
  • 本地调试时确保你当前登录的Azure账号和VM托管标识一样有对应存储文件共享的读写权限,即可直接运行调试无需额外配置
  • 如果VM禁用了系统分配托管标识,必须显式指定用户分配托管标识的客户端ID才能正常鉴权

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:48:03