【问题标题】:How to Get Azure Access Token using DefaultAzureCredential without storing secrets如何在不存储机密的情况下使用 DefaultAzureCredential 获取 Azure 访问令牌
【发布时间】:2022-06-13 16:19:24
【问题描述】:

我正在尝试将我的环境设置为能够从 Azure 外部访问 Azure 资源。

在查看不同的选项时,我主要遇到了许多其他选项

选项 1: 使用 Azure CLI 创建服务主体并使用客户端机密进行令牌检索和访问资源 Get Client secrets Run Time

选项 2: 使用 DefaultAzureCredential (Azure.Identity) 进行令牌检索和访问资源 DefaultAzureCredential

我目前正在尝试使用 DefaultAzureCredential 选项来访问 Azure 资源,例如 ADF、Blob 存储等。

我可以使用 Visual Studio 凭据 (VS 2019) 执行此操作。然而,挑战仍然是通过在 Azure 之外运行的管道执行相同的操作。我不想在代码中保存任何秘密。这是否意味着我不能将环境变量用于目的?

如果这确实可行,那么需要代码方面的帮助。

环境: .网络框架 4.8/核心 3.1

所需流量:

使用 Visual Studio 凭据进行本地开发和测试。

通过 DevOps Pipeline 任务使用环境变量或 DefaultAzureCredential 支持的其他任务。

代码:

var tokenCredential = new DefaultAzureCredential();
var accessToken = await tokenCredential.GetTokenAsync(
    new TokenRequestContext(scopes: new string[] { ResourceId + "/.default" }) { }
);

【问题讨论】:

  • 您熟悉 Azure DevOps 中的服务连接的概念吗?如果没有,从那里开始。
  • 谢谢,丹尼尔,我还没有尝试这个选项。然而,为了清晰起见,我们正试图通过代码来处理这个问题。

标签: azure-devops defaultazurecredential


【解决方案1】:

我能够使用 DefaultAzureCredential 解决此问题。我们按照以下方法解决了这个问题

  1. 添加了从 appsetting.json 读取机密的代码
  2. 向环境变量添加机密
  3. 使用 DefaultAzureCredential* 进行正确覆盖。
  4. 在构建/发布管道中添加替换令牌任务,以使用管道参数中的机密替换客户端机密变量。
  5. 从 Visual Studio 执行的代码未从 appsetting.json 中找到秘密变量的实际值,然后使用 VisualStudio 凭据。

读取值

    string AZURE_CLIENT_SECRET = ConfigurationHelper.GetByName("AZURE_CLIENT_SECRET");
    string AZURE_CLIENT_ID = ConfigurationHelper.GetByName("AZURE_CLIENT_ID");
    string AZURE_TENANT_ID = ConfigurationHelper.GetByName("AZURE_TENANT_ID");

        // Check whether the environment variable exists.

        if (AZURE_CLIENT_SECRET != "{{AZURE_CLIENT_SECRET}}"
            && AZURE_CLIENT_ID != "{{AZURE_CLIENT_ID}}" &&
            AZURE_TENANT_ID != "{{AZURE_TENANT_ID}}")
        {
            Environment.SetEnvironmentVariable("AZURE_CLIENT_SECRET", AZURE_CLIENT_SECRET);
            Environment.SetEnvironmentVariable("AZURE_CLIENT_ID", AZURE_CLIENT_ID);
            Environment.SetEnvironmentVariable("AZURE_TENANT_ID", AZURE_TENANT_ID);

            Console.WriteLine("Setting Environment Variables");
        }

调用 DefaultAzureCredential

var objDefaultAzureCredentialOptions = new DefaultAzureCredentialOptions
                {
                    ExcludeEnvironmentCredential = false,
                    ExcludeManagedIdentityCredential = true,
                    ExcludeSharedTokenCacheCredential = true,
                    ExcludeVisualStudioCredential = false,
                    ExcludeVisualStudioCodeCredential = false,
                    ExcludeAzureCliCredential = true,
                    ExcludeInteractiveBrowserCredential = true
                };

 var tokenCredential = new DefaultAzureCredential(objDefaultAzureCredentialOptions);

ValueTask<AccessToken> accessToken = tokenCredential.GetTokenAsync(
                        new TokenRequestContext(scopes: new[] { "https://management.azure.com/.default" }));
  • 如果活动会话中存在环境变量,则代码使用环境变量

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2012-09-12
    • 1970-01-01
    • 2019-05-17
    相关资源
    最近更新 更多