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

Posted

技术标签:

【中文标题】如何将 AzureDefaultCredentials 与 Azure Fluent 结合使用?【英文标题】:How to use AzureDefaultCredentials with 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

【问题讨论】:

【参考方案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);
            
        
    

来源和灵感:

https://mderriey.com/2020/07/17/connect-to-azure-sql-with-aad-and-managed-identities/ Using authentication token in azure sdk fluent

更新: 正如 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

以上是关于如何将 AzureDefaultCredentials 与 Azure Fluent 结合使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何将Ios文件上传到

Qt如何将文字变成图片?

如何将Bitmap保存为本地图片文件?

在MATLAB中如何将图导出

ASP如何将SQLSERVER数据导出到DBF(VF)

如何将CSV格式转换成JSON格式