如何从 C# 代码轮换 Azure 存储帐户访问密钥?

Posted

技术标签:

【中文标题】如何从 C# 代码轮换 Azure 存储帐户访问密钥?【英文标题】:How to rotate an Azure storage account access key from C# code? 【发布时间】:2021-12-21 05:50:36 【问题描述】:

我有一个 Azure 存储帐户。它有许多相关联的访问密钥。从 Azure Web GUI 可以“轮换”这些密钥。

也可以从命令行旋转它们,使用(我相信)az storage account keys renew

我想从 C# 代码中轮换这些键。我很难找到让我这样做的正确对象。

我知道像 Azure.Storage.BlobsMicrosoft.Azure.Cosmos.Table 这样的 NuGet 包。这些家族之一的任何 NuGet 包中是否有任何类具有让我轮换/更新/重新生成这些存储帐户访问密钥的功能?

提前致谢!

【问题讨论】:

【参考方案1】:

您要使用的 Nuget 包是 Azure.ResourceManager.Storage。创建/获取StorageAccount 的实例后,您需要调用RegenerateKeyAsync 方法来重新生成密钥。

这是相同的示例代码。请注意,您还需要安装Azure.Identity Nuget 包。

using System;
using System.Threading.Tasks;
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.Storage;
using Azure.ResourceManager.Storage.Models;

namespace SO69882633

    class Program
    
        private const string subscriptionId = "23456789-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
        private const string resourceGroupName = "resource-group-name";
        private const string storageAccountName = "storageaccountname";
        private const string keyToRegenerate = "key2";//Key to regenerate. Could be either "key1" or "key2"
        static async Task Main(string[] args)
        
            var credentials = new DefaultAzureCredential();
            ArmClient armClient = new ArmClient(new DefaultAzureCredential());
            string storageAccountResourceId =
                $"/subscriptions/subscriptionId/resourceGroups/resourceGroupName/providers/Microsoft.Storage/storageAccounts/storageAccountName";
            StorageAccount storageAccount = armClient.GetStorageAccount(storageAccountResourceId);
            var keys = await storageAccount.GetKeysAsync();
            foreach (var key in keys.Value.Keys)
            
                Console.WriteLine($"key.KeyName: key.Value");
            
            Console.WriteLine("===========================");
            StorageAccountRegenerateKeyParameters parameters = new StorageAccountRegenerateKeyParameters(keyToRegenerate);
            var result = await storageAccount.RegenerateKeyAsync(parameters);
            Console.WriteLine($"\"keyToRegenerate\" key regenerated successfully.");
            Console.WriteLine("Listing keys again (just to make sure ;-))...");
            keys = await storageAccount.GetKeysAsync();
            foreach (var key in keys.Value.Keys)
            
                Console.WriteLine($"key.KeyName: key.Value");
            
            Console.WriteLine("===========================");
        
    

【讨论】:

谢谢。我对使用该软件包犹豫不决,因为显然它没有正式版本,只有 beta 版本。此外,我不知道如何实例化StorageAccount。您能否展示 - 或链接到 - 如何实例化 StorageAccount 的示例?而且,至关重要的是,您使用的是什么版本的 NuGet 了解您对预览版 SDK 的评论。还有一个旧版本的 SDK 可用:Microsoft.Azure.Management.Storage。我相信这个新 SDK 的当前版本是1.0.0-beta.3。 HTH。 最新的预发布版本是 1.0.0-beta.3,是的。但是您链接到的示例不是来自 1.0.0-beta.3。该示例似乎来自未发布的母版,并且自上次预发布以来,代码库似乎发生了很多的变化。当我从他们的 GitHub 签出标签 1.0.2 时,我找不到任何 StorageAccount 类。 我从他们的测试中获取了示例代码。你愿意使用这个预发布版本吗?我会尝试编写一些代码来使用这个版本的 SDK。 我愿意将它用于这些目的,是的。

以上是关于如何从 C# 代码轮换 Azure 存储帐户访问密钥?的主要内容,如果未能解决你的问题,请参考以下文章

Azure 存储帐户 - 加密

如何在 Azure 中的密钥轮换后为存储 Blob 的客户端请求提供服务

使用 c# 从 Azure 存储帐户表中检索记录,同时使用 xamarin 开发跨平台应用程序给出错误

ARM - 如何从存储帐户获取访问密钥,以便稍后在模板中的 AppSettings 中使用?

如何从发布任务修改 Azure DevOps 发布定义变量?

从 iis (C# API) 访问 azure 文件共享