【发布时间】: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