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

如何用.NET创建Azure存储加密范围及容器?认证与最佳实践咨询

.NET 操作 Azure 存储账户加密范围指南

一、能否用存储密钥创建/获取加密范围?

不行。加密范围的创建、查询、修改等管理操作属于 Azure 资源管理器(ARM)范畴,只能通过 AAD 身份认证 执行,无法使用存储账户访问密钥完成。存储密钥仅能用于操作 Blob/容器等数据层面的资源,无法触及加密范围这类账户级管理资源。

二、如何通过 .NET 创建加密范围(AAD 认证方式)

首先安装所需 NuGet 包:

Install-Package Azure.ResourceManager
Install-Package Azure.ResourceManager.Storage

使用 ArmClient 执行加密范围创建操作:

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

// 初始化 AAD 凭据(支持环境变量、托管标识、Azure CLI 等多种认证方式)
var cred = new DefaultAzureCredential();
var armClient = new ArmClient(cred);

// 替换为你的订阅 ID、资源组名称、存储账户名称
var subscriptionId = "your-subscription-id";
var resourceGroupName = "your-resource-group";
var storageAccountName = "your-storage-account";

// 获取目标存储账户资源
var subscription = armClient.GetSubscriptionResource(new Azure.Core.ResourceIdentifier($"/subscriptions/{subscriptionId}"));
var resourceGroup = await subscription.GetResourceGroupAsync(resourceGroupName);
var storageAccount = await resourceGroup.GetStorageAccountAsync(storageAccountName);

// 构造加密范围参数(示例为微软托管密钥,如需客户托管密钥需额外配置)
var encryptionScopeData = new EncryptionScopeData()
{
    EncryptionScopeProperties = new EncryptionScopeProperties()
    {
        Source = EncryptionScopeSource.MicrosoftStorage,
        State = EncryptionScopeState.Enabled
    }
};

// 替换为你的加密范围名称
var encryptionScopeName = "your-encryption-scope-name";
var encryptionScope = await storageAccount.GetEncryptionScopes().CreateOrUpdateAsync(WaitUntil.Completed, encryptionScopeName, encryptionScopeData);

三、同步创建加密范围与容器的可行性及最佳实践

你当前的代码无法实现同步创建,因为容器创建时指定的加密范围必须预先存在,否则会直接报错。正确流程需分两步执行:

  1. 先通过 ARM 客户端创建加密范围(AAD 认证)
  2. 再使用 Blob 客户端创建容器并关联已存在的加密范围

优化后的完整流程代码

// 第一步:创建加密范围(AAD 认证)
var cred = new DefaultAzureCredential();
var armClient = new ArmClient(cred);
var subscription = armClient.GetSubscriptionResource(new Azure.Core.ResourceIdentifier($"/subscriptions/{subscriptionId}"));
var resourceGroup = await subscription.GetResourceGroupAsync(resourceGroupName);
var storageAccount = await resourceGroup.GetStorageAccountAsync(storageAccountName);

var encryptionScopeName = blobContainerName; // 用容器名作为加密范围名
var encryptionScopeData = new EncryptionScopeData()
{
    EncryptionScopeProperties = new EncryptionScopeProperties()
    {
        Source = EncryptionScopeSource.MicrosoftStorage,
        State = EncryptionScopeState.Enabled
    }
};
await storageAccount.GetEncryptionScopes().CreateOrUpdateAsync(WaitUntil.Completed, encryptionScopeName, encryptionScopeData);

// 第二步:创建容器并关联加密范围(可使用存储密钥/连接字符串)
var blobServiceClient = new BlobServiceClient(connectionString);
var containerClient = blobServiceClient.GetBlobContainerClient(blobContainerName);
await containerClient.CreateIfNotExistsAsync(PublicAccessType.None, null, new BlobContainerEncryptionScopeOptions
{
    PreventEncryptionScopeOverride = true,
    DefaultEncryptionScope = encryptionScopeName
});

最佳实践建议

  • 分离管理与数据操作:用 AAD 认证执行加密范围等账户管理操作,用存储密钥/SAS 令牌执行数据操作,符合 Azure 最小权限原则。
  • 提前创建加密范围:避免在容器创建时依赖未存在的资源,减少异常风险。
  • 使用 DefaultAzureCredential:无需硬编码凭据,支持本地开发(Azure CLI)、部署环境(托管标识)等多种场景,提升安全性与灵活性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:08:20