azure - 使用 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 并从密钥保管库中读取值,但我预计这会快得多。
这是预期的行为吗?我能做些什么来加快速度吗?
解决方案
对于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 cli
auth 不需要硬编码clientSecret
或将其存储为纯文本。
更新 (2021-03-22)
与较新的 Azure 客户端 SDK(如 )兼容的 Azure.Identity 身份验证提供程序Azure.Security.KeyVault.Secrets
具有基于代码的选项(而不是连接字符串)来跳过某些身份验证方法。你可以:
在DefaultAzureCredential 构造函数中设置排除项,或
使用更具体的类类型构造函数生成 TokenCredential (另请参见此处的身份验证提供程序迁移图表)。
推荐阅读
- javascript - 如何让机器人忽略其他机器人造成的其他操作?
- kubernetes - Kubernetes 子域供应
- android - Don't work Get x and y pixel of touch in version 4.2.0 to high of Carto mobile SDK
- android - 迭代 JSON 数组并使用 Name 值来识别一个 TextView Android
- java - java Haversine公式(数学)NullPointerException报错问题
- javascript - 如何读出 Javascript 中元素的位置?
- python - subprocess.check_output 显示忽略异常时的错误输出
- reactjs - Why calling useState function is working without declaring it?
- javascript - 允许用于 chrome 扩展清单匹配的 URI 方案
- java - 为什么我在这里得到 java.lang.ArrayIndexOutOfBoundsException?