【问题标题】:How to use AzureDefaultCredentials with Azure Fluent?如何将 AzureDefaultCredentials 与 Azure Fluent 结合使用?
【发布时间】:2021-05-27 18:13:24
【问题描述】:

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

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

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

  • 有没有办法用BlobClient 重新生成密钥,以便我可以使用DefaultAzureCredentials
  • 或者有没有办法通过 Fluent API 使用 DefaultAzureCredentials

【问题讨论】:

    标签: c# .net azure azure-storage azure-authentication


    【解决方案1】:

    这是我刚开始使用 .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);
                }
            }
        }
    }
    

    来源和灵感:

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

    【讨论】:

    • 请注意,对于运行时间较长的场景(服务等),此解决方案将在令牌过期后立即中断。对于示例中的小型应用程序,它可以按预期工作。
    • @SimonOpelt 非常感谢您指出这一点。由于我认为这是非常重要的信息,因此我相应地更新了我的答案。
    【解决方案2】:

    首先:是的,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 实际上是可选的。

    【讨论】:

    • 不幸的是,AzureServiceTokenProvider 的文档提到该类已被弃用,您应该使用 Azure.Identity
    猜你喜欢
    • 2017-12-09
    • 2013-02-01
    • 2021-11-03
    • 2020-05-27
    • 2021-05-07
    • 1970-01-01
    • 2019-03-26
    • 2019-11-09
    • 1970-01-01
    相关资源
    最近更新 更多