如何在 Visual Studio 代码调试期间传递 Azure KeyVault 的访问令牌

How to pass access token for Azure KeyVault during Visual Studio Code debug

我工作的团队正在研究在 Visual Studio 代码中调试未来的项目。我们已将调试器设置为与我们的 project.The 项目一起工作,该项目将 Azure Key Vault 用于我们的应用程序机密。问题是,当调试器尝试传递代码的 Azure KeyVault 部分和 returns:

时,我们的 Startup 中断了

发生异常:CLR/Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException

在 Visual Studio 中,我使用我的帐户登录并且在调试期间 Visual Studio 能够从我的帐户中提取访问令牌。

我在尝试开始调试之前尝试使用 Azure 帐户 Visual Studio 代码扩展登录,但即使我已登录,它 returns 同样的异常。

我获取 Azure KeyVault 的代码如下所示:

        AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
        KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));

        AzureADAppSettings azureADAppSettings = Configuration.GetSection("Authentication").GetSection("AzureAd").Get<AzureADAppSettings>();
        if (azureADAppSettings.ApplicationSecret.StartsWith("https://"))
            azureADAppSettings.ApplicationSecret = keyVaultClient.GetSecretAsync(azureADAppSettings.ApplicationSecret).GetAwaiter().GetResult().Value;

我希望 Azure 帐户能够让我像 Visual Studio 中一样使用 Azure KeyVault。

相反,代码会因异常而中断。

谁能告诉我我做错了什么?

我想你想在 VS Code 中获取 keyvault 秘密,我按照这个 link 创建一个 .NET Core 控制台应用程序来尝试一下,它在我这边有效。

确保您已经安装 运行 代码的扩展,Microsoft.Azure.Services.AppAuthenticationMicrosoft.Azure.KeyVault NuGet 包。

要访问 azure keyvault,我使用 Authenticating with Azure CLI。确保您已在本地安装 Azure CLI,然后打开 Microsoft Azure Command Prompt,使用您的用户帐户登录,select 您的 keyvault 所在的正确订阅。

az login
az account set --subscription <subscription-id>

您也可以尝试使用az account get-access-token --resource https://vault.azure.net来验证访问权限,例如解码 https://jwt.io/ 中的令牌以查看它是否在正确的租户中,等等

然后在VS Code中,在VS Code中创建控制台应用程序后,打开文件夹,Program.cs中的代码如下。

using System;
using Microsoft.Azure.KeyVault;
using Microsoft.Azure.Services.AppAuthentication;

namespace test1
{
    class Program
    {
        static void Main(string[] args)
        {
            var azureServiceTokenProvider1 = new AzureServiceTokenProvider();
            var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider1.KeyVaultTokenCallback));
            var secret = kv.GetSecretAsync("https://keyvaultname.vault.azure.net/", "test2").GetAwaiter().GetResult();
            Console.WriteLine(secret);

        }
    }
}