Я пытаюсь настроить свое веб-приложение, размещенное в Azure, для чтения настроек из Azure KeyVault.
Я следовал этому руководству: https://anthonychu.ca/post/secrets-aspnet-core-key-vault-msi/
В примере показано, как получить доступ к настройкам приложения из KeyVault с помощью конфигурации:
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((ctx, builder) =>
{
var keyVaultEndpoint = Environment.GetEnvironmentVariable("KEYVAULT_ENDPOINT");
if (!string.IsNullOrEmpty(keyVaultEndpoint))
{
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback));
builder.AddAzureKeyVault(
keyVaultEndpoint, keyVaultClient, new DefaultKeyVaultSecretManager());
}
})
.UseApplicationInsights()
.UseStartup<Startup>()
.Build();
Я добавил переменную среды KEYVAULT_ENDPOINT в настройки приложения. Я включил MSI в службе приложений и авторизовал своего пользователя Azure и свое приложение из политик доступа к хранилищу ключей:
![enter image description here](https://i.stack.imgur.com/iUv3x.png)
Операции получения и получения списка:
И я добавил секрет в хранилище ключей. Работая локально, я могу получить доступ к секрету.
Но мой сайт ASP .NET Core не запускается при запуске с этим в журналах stdout:
Unhandled Exception: Microsoft.Azure.KeyVault.Models.KeyVaultErrorException: Operation returned an invalid status code 'Forbidden'
at Microsoft.Azure.KeyVault.KeyVaultClient.GetSecretsWithHttpMessagesAsync(String vaultBaseUrl, Nullable`1 maxresults, Dictionary`2 customHeaders, CancellationToken cancellationToken)
at Microsoft.Azure.KeyVault.KeyVaultClientExtensions.GetSecretsAsync(IKeyVaultClient operations, String vaultBaseUrl, Nullable`1 maxresults, CancellationToken cancellationToken)
at Microsoft.Extensions.Configuration.AzureKeyVault.AzureKeyVaultConfigurationProvider.LoadAsync()
at Microsoft.Extensions.Configuration.AzureKeyVault.AzureKeyVaultConfigurationProvider.Load()
at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers)
at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
at Microsoft.AspNetCore.Hosting.WebHostBuilder.BuildCommonServices(AggregateException& hostingStartupErrors)
at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
at Blog.Program.BuildWebHost(String[] args) in D:\a\1\s\[csproj name]\Program.cs:line 22
at [csproj name].Program.Main(String[] args) in D:\a\1\s\[csproj name]\Program.cs:line 16
Я проверил, что переменные среды MSI_ENDPOINT и MSI_SECRET существуют, вызвав SET из консоли отладки.
Я также вижу переменную KEYVAULT_ENDPOINT.
Есть предложения, что может пойти не так или что попробовать дальше? Поскольку он работает локально, это должно быть проблемой аутентификации, но я считаю, что он аутентифицируется локально с моим пользователем Azure, которого я авторизовал в хранилище ключей, а не в качестве службы приложений Azure.