You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Azure函数应用中读取带Key Vault引用的App Configuration值?

解决Azure App Configuration读取Key Vault引用实际值的问题

核心问题原因

直接使用ConfigurationClient获取配置项时,返回的是Key Vault引用的原始URI,而非自动解析后的实际密钥值。官方推荐通过IConfiguration结合Azure App Configuration的Key Vault整合功能,实现引用的自动解析。

解决方案1:使用IConfiguration自动解析(推荐)

步骤1:修改ConfigureAppConfiguration,添加Key Vault支持

在ConfigureAppConfiguration中配置UseAzureKeyVault,让App Configuration自动处理Key Vault引用,需借助DefaultAzureCredential获取访问权限:

using Azure.Identity;

public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
{
    var connectionString = Environment.GetEnvironmentVariable("ConnectionString");
    var credential = new DefaultAzureCredential();

    builder.ConfigurationBuilder.AddAzureAppConfiguration(options =>
    {
        options.Connect(connectionString)
               .Select("FunctionApp:*")
               .ConfigureRefresh(refreshOptions =>
               {
                   refreshOptions.Register("FunctionApp:Replication:Regions", refreshAll: true);
               })
               // 启用Key Vault引用自动解析
               .UseAzureKeyVault(credential);
    });
}

步骤2:通过IConfiguration获取解析后的实际值

修改StorageService,注入IConfiguration替代ConfigurationClient,直接读取解析后的密钥值:

private readonly IConfiguration _configuration;
private readonly IConfigurationRefresher _configurationRefresher;

public StorageService(IConfiguration configuration, IConfigurationRefresherProvider refresherProvider)
{
    _configuration = configuration;
    _configurationRefresher = refresherProvider.Refreshers.First();
}

public async Task<List<string>> GetRegionSecretsAsync()
{
    // 触发配置刷新(按需调用)
    await _configurationRefresher.TryRefreshAsync();

    // 获取所有区域对应的密钥值
    var regionSecrets = new List<string>();
    var regionSection = _configuration.GetSection("FunctionApp:Replication:Regions");
    
    foreach (var childSetting in regionSection.GetChildren())
    {
        regionSecrets.Add(childSetting.Value);
    }

    return regionSecrets;
}

权限配置

确保函数应用的托管身份(或服务主体)拥有以下权限:

  • Azure App Configuration的读取权限
  • Key Vault的**机密读取(Secret Get)**权限

解决方案2:手动解析Key Vault引用(不推荐)

若必须使用ConfigurationClient,可手动解析每个配置项的URI,调用Key Vault API获取实际值:

步骤1:定义Key Vault引用模型

using System.Text.Json.Serialization;

public class KeyVaultReference
{
    [JsonPropertyName("uri")]
    public Uri Uri { get; set; }
}

步骤2:手动解析并获取密钥

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using System.Text.Json;

private readonly ConfigurationClient _client;
private readonly IConfigurationRefresher _configurationRefresher;
private readonly SecretClient _secretClient;

public StorageService(ConfigurationClient client, IConfigurationRefresherProvider refresherProvider)
{
    _client = client;
    _configurationRefresher = refresherProvider.Refreshers.First();
    // 初始化SecretClient
    var credential = new DefaultAzureCredential();
    _secretClient = new SecretClient(new Uri("https://appconfigurationkeyvalut.vault.azure.net/"), credential);
}

public async Task<List<string>> GetRegionSecretsAsync()
{
    // 触发配置刷新
    await _configurationRefresher.TryRefreshAsync();

    SettingSelector settingSelector = new SettingSelector()
    {
        KeyFilter = "FunctionApp:Replication:Regions"
    };

    var settings = _client.GetConfigurationSettings(settingSelector).ToList();
    var regionSecrets = new List<string>();

    foreach (var setting in settings)
    {
        // 解析Key Vault引用的JSON
        var kvRef = JsonSerializer.Deserialize<KeyVaultReference>(setting.Value);
        // 获取密钥值
        var secret = await _secretClient.GetSecretAsync(kvRef.Uri.AbsolutePath.TrimStart('/'));
        regionSecrets.Add(secret.Value.Value);
    }

    return regionSecrets;
}

内容的提问来源于stack exchange,提问作者Ali Hasan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:05:14