如何将 AzureDefaultCredentials 与 Azure Fluent 结合使用?

Wou*_*ort 6 .net c# azure azure-storage azure-authentication

我正在尝试在 C# 中创建一个重新生成存储密钥的 Azure 函数。我正在努力寻找正确的 .NET 库,在其中我可以验证并重新生成密钥。

我发现进行身份验证的最简单方法是使用DefaultAzureCredentials并将它们传递给BlobClient. 但我在 上找不到重新生成密钥的选项BlobClient

我发现在存储帐户上重新生成密钥的唯一方法是使用,Microsoft.Azure.Management.Fluent但 Fluent API 不支持DefaultAzureCredentials. 相反,我认为我需要使用SdkContext.AzureCredentialsFactory没有托管身份和 VS Code 的自动回退功能的工具DefaultCredentials

  • 有什么方法可以重新生成密钥BlobClient以便我可以使用吗DefaultAzureCredentials
  • DefaultAzureCredentials或者有没有办法与 Fluent API 一起使用?

Mic*_*ner 11

这是我刚刚使用 .NET 5.0 的另一个变体。它使用 DefaultAzureCredential 并将其转换为 AzureCredentials 实例。作为测试,它随后查询默认订阅中的 ACR 实例列表并打印它们的名称。如果您正在使用一个或多个已支持 DefaultAzureCredential 的其他库,则此变体非常有用。

using System;
using Azure.Core;
using Azure.Identity;
using Microsoft.Azure.Management.ResourceManager.Fluent;

namespace Program
{
    class Program
    {
        static void Main(string[] args)
        {
            var defaultCredential = new DefaultAzureCredential();
            var defaultToken = defaultCredential.GetToken(new TokenRequestContext(new[] { "https://management.azure.com/.default" })).Token;
            var defaultTokenCredentials = new Microsoft.Rest.TokenCredentials(defaultToken);
            var azureCredentials = new Microsoft.Azure.Management.ResourceManager.Fluent.Authentication.AzureCredentials(defaultTokenCredentials, defaultTokenCredentials, null, AzureEnvironment.AzureGlobalCloud);
            var azure = Microsoft.Azure.Management.Fluent.Azure.Configure().Authenticate(azureCredentials).WithDefaultSubscription();
            var acrList = azure.ContainerRegistries.List();
            foreach (var acr in acrList)
            {
                Console.WriteLine(acr.Name);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

来源和灵感:

更新:正如 Simon Opelt 在他们的评论中完全正确地指出的那样:对于长时间运行的流程(例如服务),令牌确实会过期,并且需要处理它们的续订。我的示例来自 Azure Function App,最多运行 10 分钟。


sil*_*ent 1

首先:是的,BlobClient(以及与之相关的整个 SDK)仅用于存储帐户的数据平面操作。然而,密钥轮换是管理平面操作。因此你是对的,你需要 Management SDK。

我不久前也在寻找这个,但找不到使用 DefaultAzureCrendtials 和 Fluent SDK 的方法。我重新开始使用 AzureServiceTokenProvider,它对我来说也完全正常:

var tenantId = Environment.GetEnvironmentVariable("tenantId");
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var token = await azureServiceTokenProvider.GetAccessTokenAsync("https://management.azure.com", tenantId);
var tokenCredentials = new TokenCredentials(token);
log.LogInformation("Got AAD token. Creating Azure client");
var azure = Microsoft.Azure.Management.Fluent.Azure
    .Configure()
    .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
    .Authenticate(new AzureCredentials(tokenCredentials, tokenCredentials, tenantId, AzureEnvironment.AzureGlobalCloud))
    .WithDefaultSubscription();
Run Code Online (Sandbox Code Playgroud)

如果您的目标是用户默认租户,IIRCtenantId 实际上是可选的。