AzureでホストされているWebアプリをセットアップして、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を有効にし、Key VaultアクセスポリシーからAzureユーザーとアプリケーションを承認しました。
GetおよびList操作の場合:
そして、私は秘密をKey Vaultに追加しました。ローカルで実行すると、シークレットにアクセスできます。
しかし、私の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
デバッグコンソールからSETを呼び出して、MSI_ENDPOINTおよびMSI_SECRET環境変数が存在することを確認しました。
KEYVAULT_ENDPOINT変数も確認できます。
何が間違っているのか、次に何を試すのかについての提案はありますか?ローカルで機能するため、認証の問題である必要がありますが、Azure App Serviceとしてではなく、Key Vaultで承認したAzureユーザーでローカルに認証していると考えています。
この問題を解決するには、「信頼されたMicrosoftサービスを許可する...」を選択したときにすべてが追加されるわけではないため、WebアプリのIPアドレスをファイアウォールに追加する必要がありました。
おかげで: https://azidentity.azurewebsites.net/post/2019/01/03/key-vault-firewall-access-by-Azure-app-services
環境変数を扱うときに開発システムと実稼働システムが同じように動作しないという問題を以前に見ました。
これらのシナリオで検討する最初の領域は、実稼働システムで環境変数にASPNETCORE_
を適切にプレフィックスしたかどうかを確認することです。このプレフィックスは、ASP.NET Core Webホストのデフォルトのプレフィックスです。
| Key | Value |
|====================================|============================|
| ASPNETCORE_KEYVAULT_ENDPOINT | xxxxxxxxxxxxxxxx |
| ASPNETCORE_MSI_ENDPOINT** | xxxxxxxxxxxxxxxx |
| ASPNETCORE_MSI_SECRET** | xxxxxxxxxxxxxxxx |
**あなたのコードでは、
MSI_ENDPOINT
やMSI_SECRET
を使用しているのを見たことがないことに注意してください。KEYVAULT_ENDPOINT
を使用しているだけです
明示的に別のプレフィックスを設定する場合は、設定を使用してWebホストを初期化するときに、使用するプレフィックスを引数として渡すことができます。
.AddEnvironmentVariables("ASPNETCORE_"); // choose your own prefix here