【问题标题】:Azure Functions Configuration Key Vault Provider not workingAzure Functions 配置 Key Vault 提供程序不起作用
【发布时间】:2021-05-20 09:11:07
【问题描述】:

我想使用 Azure Key Vault Provider 来填充我的应用配置。将Microsoft.Azure.Functions.Extensions 1.1.0 与Azure.Extensions.AspNetCore.Configuration.Secrets 结合使用,我的代码如下所示:

local.settings.json

{
    "IsEncrypted": false,
    "Values": {
        "KeyVaultUri": "https://meh.vault.azure.net/",
        "TEST:SuperSecret": "secret-name-of-key-vault-entry"
    }
}

Startup.cs

[assembly: FunctionsStartup(typeof(Startup))]
namespace myNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddOptions<AppSettingsSecrets>()
                .Configure<IConfiguration>((cfgSection, cfg) => cfg.GetSection("TEST").Bind(cfgSection));
        }
    
        public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
        {
            var builtConfig = builder.ConfigurationBuilder.Build();
            var kvEndpoint = builtConfig["KeyVaultUri"];
            var cred = new ChainedTokenCredential(new ManagedIdentityCredential(), new AzureCliCredential()); 
            var opt = new AzureKeyVaultConfigurationOptions { ReloadInterval = TimeSpan.FromHours(24)};
            
            builder.ConfigurationBuilder
                .AddAzureKeyVault(new Uri(kvEndpoint), cred, opt)
                .SetBasePath(Environment.CurrentDirectory)
                .AddJsonFile("local.settings.json", optional: true)
                .AddEnvironmentVariables()
                .Build();
        }
    }
}

函数.cs

namespace myNamespace
{
    public class SEC
    {
        private readonly IOptions<AppSettingsSecrets> _s;
        public SEC(IOptions<AppSettingsSecrets> s) => _s = s;

        [FunctionName(nameof(SEC))]
        public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = "sec")] HttpRequest req, ILogger log)
        {
            log.LogInformation(_s.Value.SuperSecret);
            return new OkObjectResult(true);
        }
    }
}

现在当我调用时

iwr http://localhost:7071/api/sec

将记录的是秘密名称secret-name-of-key-vault-entry 的文字值。不是密钥保管库中的密钥值。

这绝对不是访问策略的问题,因为之前我使用相同的用户主体从同一个保管库手动查询机密。

我错过了什么?任何帮助表示赞赏。

【问题讨论】:

    标签: azure-functions azure-keyvault asp-net-config-builders


    【解决方案1】:

    我在YouTube 上找到了一个可行的解决方案。在这里发帖,也许其他人可能会受益。

    local.settings.json:此处不存在秘密配置值

    {
        "IsEncrypted": false,
        "Values": {
            "KeyVaultUri": "https://meh.vault.azure.net/",
        },
        "Settings": {
            "IsProd": false
        }
    }
    

    AppSettings.cs

    namespace myNamespace
    {
        public class AppSettings
        {
            public bool IsProd {get; set;}
            public string GraphCredential {get; set;} = string.Empty;
        }
    }
    

    然后在密钥库中注册一个名为 Settings--GraphCredential 的秘密(两个破折号!)

    namespace myNamespace
    {
        public class Startup : FunctionsStartup
        {
            public override void Configure(IFunctionsHostBuilder builder)
            {
                builder.Services.AddOptions<AppSettings>()
                    .Configure<IConfiguration>((cfgSection, cfg) => cfg.GetSection("Settings").Bind(cfgSection));
            }
        
            public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
            {
                var builtConfig = builder.ConfigurationBuilder.Build();
                var kvEndpoint = builtConfig["KeyVaultUri"];
                var cred = new ChainedTokenCredential(new ManagedIdentityCredential(), new AzureCliCredential()); 
                var opt = new AzureKeyVaultConfigurationOptions { ReloadInterval = TimeSpan.FromHours(24)};
                
                builder.ConfigurationBuilder
                    .AddAzureKeyVault(new Uri(kvEndpoint), cred, opt)
                    .SetBasePath(Environment.CurrentDirectory)
                    .AddJsonFile("local.settings.json", optional: true)
                    .AddEnvironmentVariables()
                    .Build();
            }
        }
    }
    

    【讨论】:

    • 仅供参考,当部署到 Azure 时,我注意到分配给函数应用程序的保管库访问策略现在除了 GET 之外还需要秘密 LIST 权限。否则主机不启动
    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 2019-12-01
    • 2021-11-28
    • 1970-01-01
    • 2020-10-30
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多