Azure应用配置,密钥保险库和托管服务身份(.NET Core 3.1)

时间:2020-05-12 23:57:12

标签: azure azure-web-app-service azure-keyvault azure-app-configuration

我设置了一个简单的应用程序服务,以使用/测试Azure应用程序配置

  • Azure应用程序配置包含2个非KeyVault条目和1个条目,这些条目是Key Vault引用
  • 密钥保管库使用适当的访问策略设置,允许获取/列出Azure App Config的托管服务标识的机密

我遵循了sample application,所以CreateHostBuilder看起来像:

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
webBuilder.ConfigureAppConfiguration((hostingContext, config) =>
{
    var settings = config.Build();
    config.AddAzureAppConfiguration(settings["ConnectionStrings:AppConfig"]);
})
.UseStartup<Startup>());

在部署/运行应用程序时,如果没有指向KeyVault的Azure App Config条目,则行为成功。

当我在Azure App Config中添加指向KeyVault的条目时,该应用程序将无法启动(HTTP错误500.30-ANCM进程内启动失败),日志显示此异常:

异常信息:Microsoft.Extensions.Configuration.AzureAppConfiguration.KeyVaultReferenceException:没有配置密钥保险库凭据,也找不到匹配的秘密客户端。ErrorCode:,Key:TestConnectionString,Label:,Etag:6ezsqW96CsAet7Ym5H4DedsLTkI,SecretIdentifier: https://testkeyvault.vault.azure.net/secrets/TestSecret ---> System.UnauthorizedAccessException:没有配置密钥保险库凭证,也找不到匹配的秘密客户端。

很明显,某些东西没有得到正确的保护,但是我已经检查了很多次,并且Key Vault拥有一个访问策略,用于将“获取/列出的机密”授予Azure App Config身份。

我还尝试了主机构建器中的ConfigureKeyVault选项,即

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder =>
    webBuilder.ConfigureAppConfiguration((hostingContext, config) =>
    {
        var settings = config.Build();

        config.AddAzureAppConfiguration(options =>
        {
            options.Connect(settings["ConnectionStrings:AppConfig"])
                    .ConfigureKeyVault(kv =>
                    {
                        kv.SetCredential(new DefaultAzureCredential());
                    });
        });
    })
    .UseStartup<Startup>());

密钥保管库上的访问策略是否将所有需要完成的操作授予“获取/列出秘密”给Azure App Config身份,还是我错过了什么? (我也尝试过授予对应用程序服务的访问策略,不走运)。

1 个答案:

答案 0 :(得分:3)

对于密钥保管库参考,应用程序需要设置对“应用程序配置”和“密钥保管库”的身份验证。这两个服务无法直接通信,因此App Configuration不需要对Key Vault的任何访问权限。使用ConfigureKeyVault的代码段是正确的。它指定DefaultAzureCredential用于对Key Vault进行身份验证,以便解析密钥库引用。

为使您托管在Azure App Service中的应用程序能够访问Key Vault中的机密,可以在App Service上启用托管身份,并在Key Vault中为其授予GET和LIST权限。

对于开发环境,these指令可用于创建服务主体,授予权限并设置适当的环境变量以供DefaultAzureCredential使用。