我想使用 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"
}
}
启动.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
。不是密钥保管库中的密钥值。
这绝对不是访问策略的问题,因为之前我使用相同的用户主体从同一个保管库手动查询机密。
我错过了什么?任何帮助表示赞赏。