C# 如何在Azure Fluent中使用AzureDefaultCredentials?

C# 如何在Azure Fluent中使用AzureDefaultCredentials?,c#,.net,azure,azure-storage,azure-authentication,C#,.net,Azure,Azure Storage,Azure Authentication,我试图在C#中创建一个Azure函数,用于重新生成存储密钥。我正在努力找到正确的.NET库,在那里我可以验证和重新生成密钥 我发现的最简单的身份验证方法是使用DefaultAzureCredentials并将其传递给BlobClient。但是我在BlobClient上的任何位置都找不到重新生成密钥的选项 我发现在存储帐户上重新生成密钥的唯一方法是使用Microsoft.Azure.Management.Fluent,但Fluent API不支持DefaultAzureCredentials。相反

我试图在C#中创建一个Azure函数,用于重新生成存储密钥。我正在努力找到正确的.NET库,在那里我可以验证和重新生成密钥

我发现的最简单的身份验证方法是使用
DefaultAzureCredentials
并将其传递给
BlobClient
。但是我在
BlobClient
上的任何位置都找不到重新生成密钥的选项

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

  • 是否有某种方法可以使用
    BlobClient
    重新生成密钥,以便我可以使用
    DefaultAzureCredentials
  • 或者有没有一种方法可以将
    DefaultAzureCredentials
    与Fluent API一起使用

首先:是的,BlobClient(及其周围的整个SDK)仅用于存储帐户的数据平面操作。但是,关键点旋转是一种管理平面操作。因此,您是对的,您需要管理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();

如果您以用户默认租户为目标,IIRC tenantId实际上是可选的。

这是我刚刚开始使用.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);
            }
        }
    }
}
来源和灵感:


不幸的是,AzureServiceTokenProvider的文档提到该类已被弃用,您应该使用Azure.Identity