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

如何从Service Fabric集群服务连接Azure存储账户(证书/令牌认证)

使用证书/令牌认证连接Azure存储账户(Service Fabric场景)

前提确认

你已经具备:

  • 部署在Service Fabric集群的服务
  • Azure存储账户
  • AAD中注册的应用程序

1. 给AAD应用分配存储账户RBAC权限

要通过AAD认证访问存储,必须给你的注册应用分配对应权限:

  • 登录Azure门户,找到目标存储账户
  • 进入「访问控制(IAM)」→「添加」→「添加角色分配」
  • 在「角色」列表中选择合适的权限(比如存储Blob数据所有者、存储Blob数据参与者,根据实际需求选最小权限)
  • 在「成员」选项卡中,选择「用户、组或服务主体」,搜索并选中你的AAD注册应用
  • 完成角色分配

2. 部署证书到Service Fabric节点

如果用证书获取令牌,需要将证书部署到所有Service Fabric节点的本地机器存储(LocalMachine\My):

  • 可以通过Azure门户的Service Fabric集群「证书」配置页上传证书,或者用脚本批量部署
  • 确保证书的私钥可被服务运行账户访问(默认Network Service账户需要权限,可在证书管理中设置)

3. 在Service Fabric服务中实现认证逻辑

使用Azure官方的Azure.Identity和Azure.Storage.Blobs(或对应存储类型的SDK)来实现,以下是C#示例:

3.1 安装NuGet包

在服务项目中安装:

Install-Package Azure.Identity
Install-Package Azure.Storage.Blobs

3.2 核心代码实现

using Azure.Identity;
using Azure.Storage.Blobs;
using System.Security.Cryptography.X509Certificates;
using Microsoft.ServiceFabric.Services.Runtime;

public class StorageService
{
    private readonly BlobServiceClient _blobServiceClient;

    public StorageService()
    {
        // 从Service Fabric配置包读取参数(不要硬编码)
        var configPackage = FabricRuntime.GetActivationContext().GetConfigurationPackageObject("Config");
        var authConfig = configPackage.Settings.Sections["StorageAuth"].Parameters;
        
        string tenantId = authConfig["TenantId"].Value;
        string clientId = authConfig["ClientId"].Value;
        string certThumbprint = authConfig["CertificateThumbprint"].Value;
        string storageAccountName = authConfig["StorageAccountName"].Value;

        // 从本地存储加载证书
        var certificate = LoadCertificateFromLocalStore(certThumbprint);

        // 创建证书凭据
        var credential = new ClientCertificateCredential(tenantId, clientId, certificate);

        // 初始化存储客户端(以Blob为例)
        string storageAccountUrl = $"https://{storageAccountName}.blob.core.windows.net";
        _blobServiceClient = new BlobServiceClient(new Uri(storageAccountUrl), credential);
    }

    // 辅助方法:加载本地证书
    private X509Certificate2 LoadCertificateFromLocalStore(string thumbprint)
    {
        using var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
        store.Open(OpenFlags.ReadOnly);
        var certCollection = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, validOnly: false);
        
        if (certCollection.Count == 0)
        {
            throw new InvalidOperationException($"未找到指纹为{thumbprint}的证书");
        }

        return certCollection[0];
    }

    // 示例:获取容器中的Blob列表
    public async Task<List<string>> GetBlobNamesAsync(string containerName)
    {
        var containerClient = _blobServiceClient.GetBlobContainerClient(containerName);
        var blobNames = new List<string>();

        await foreach (var blobItem in containerClient.GetBlobsAsync())
        {
            blobNames.Add(blobItem.Name);
        }

        return blobNames;
    }
}

3.3 配置Service Fabric参数

在ApplicationPackageRoot\Config\Settings.xml中添加配置:

<Section Name="StorageAuth">
  <Parameter Name="TenantId" Value="你的租户ID" />
  <Parameter Name="ClientId" Value="你的AAD应用ID" />
  <Parameter Name="CertificateThumbprint" Value="你的证书指纹" />
  <Parameter Name="StorageAccountName" Value="你的存储账户名" />
</Section>

关键注意事项

  • 最小权限原则:给AAD应用分配刚好满足业务需求的RBAC权限,避免过度授权
  • 证书权限:确保Service Fabric服务运行账户(默认Network Service)有权限读取证书的私钥
  • 令牌缓存:Azure.Identity会自动处理令牌的获取和缓存,无需手动管理过期
  • 配置安全:不要将敏感参数硬编码,使用Service Fabric的配置包或Azure Key Vault存储(进阶场景)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:55:18