首页 > 解决方案 > 使用 AddAzureKeyVault 使我的应用程序慢了 10 秒

问题描述

我有这个非常简单的 .NET Core 应用程序:

    static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
           .SetBasePath(Directory.GetCurrentDirectory())
           .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

        builder.AddAzureKeyVault("https://MyKeyVault.vault.azure.net");

        var stopwatch = new Stopwatch();
        stopwatch.Start(); 
        var configuration = builder.Build();
        var elapsed = stopwatch.Elapsed;

        Console.WriteLine($"Elapsed time: {elapsed.TotalSeconds}");
    }

csproj 文件如下所示:

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
  <OutputType>Exe</OutputType>
  <TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>

<ItemGroup>
  <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.1.1" />
  <PackageReference Include="Microsoft.Extensions.Configuration.AzureKeyVault" Version="2.1.1" />
  <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="2.1.1" />
  <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.1.1" />
  <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.1.1" />
</ItemGroup>

</Project>

我的问题是应用程序在附加调试器的情况下执行大约需要 10 秒(没有调试器大约需要 5 秒)。如果我使用AddAzureKeyVault删除该行,应用程序将在不到一秒的时间内执行。我知道AddAzureKeyVault将使应用程序连接到 Azure 并从密钥保管库中读取值,但我预计这会快得多。

这是预期的行为吗?我能做些什么来加快速度吗?

标签: azure.net-coreazure-keyvault

解决方案


对于Microsoft.Azure.Services.AppAuthentication库,请参阅原始答案。有关较新的Azure.Identity库,请参阅更新 2021-03-22。


原答案:

是的,AzureServiceTokenProvider显式配置为使用az cli身份验证。您可以通过设置一个名为AzureServicesAuthConnectionString.

重击:

export AzureServicesAuthConnectionString="RunAs=Developer; DeveloperTool=AzureCli"

电源外壳:

$Env:AzureServicesAuthConnectionString = "RunAs=Developer; DeveloperTool=AzureCli"

请注意,需要在您运行应用程序的任何会话中设置环境变量。

解释

MS docs on authentication中暗示了问题的根源,该文档指出,“默认情况下,AzureServiceTokenProvider使用多种方法来检索令牌”。

在使用的多种方法中,az cli身份验证是列表中的一种。因此,在最终将用作令牌源AzureServiceTokenProvider之前,需要一些时间来尝试其他更高级的身份验证方法。az cli在环境变量中设置连接字符串可以消除您等待其他身份验证方法失败的时间。

此解决方案比硬编码 a 更可取,clientId不仅clientSecret是为了方便,而且因为az cliauth 不需要硬编码clientSecret或将其存储为纯文本。


更新 (2021-03-22)

与较新的 Azure 客户端 SDK(如 )兼容的 Azure.Identity 身份验证提供程序Azure.Security.KeyVault.Secrets具有基于代码的选项(而不是连接字符串)来跳过某些身份验证方法。你可以:

  1. 在DefaultAzureCredential 构造函数中设置排除项,或

  2. 使用更具体的类类型构造函数生成 TokenCredential (另请参见此处的身份验证提供程序迁移图表)。


推荐阅读