it-swarm.com.de

KeyVaultErrorException: Die Operation hat einen ungültigen Statuscode 'Verboten' zurückgegeben.

Ich versuche, meine in Azure gehostete Web-App so einzurichten, dass Einstellungen von Azure KeyVault gelesen werden.

Ich habe diesen Leitfaden befolgt: https://anthonychu.ca/post/secrets-aspnet-core-key-vault-msi/

Das Beispiel zeigt, wie Sie mit der Konfiguration von KeyVault auf die App-Einstellungen zugreifen:

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();

Ich habe den Anwendungseinstellungen die Umgebungsvariable KEYVAULT_ENDPOINT hinzugefügt. Ich habe MSI für den App-Dienst aktiviert und meinen Azure-Benutzer und meine Anwendung anhand der Schlüssel-Vault-Zugriffsrichtlinien autorisiert:

 enter image description here

Mit Abruf- und Listenoperationen:

 enter image description here

Und ich habe das Geheimnis zum Schlüssellager hinzugefügt. Wenn ich lokal laufe, kann ich auf das Geheimnis zugreifen.

Meine ASP .NET Core-Site schlägt jedoch beim Start fehl, und zwar in den Standardprotokollen:

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

Ich habe überprüft, ob die Umgebungsvariablen MSI_ENDPOINT und MSI_SECRET vorhanden sind, indem Sie SET von der Debug-Konsole aus aufrufen.  enter image description here

Ich kann auch die Variable KEYVAULT_ENDPOINT sehen.

Irgendwelche Vorschläge, was könnte schief gehen oder als nächstes versuchen? Da es lokal funktioniert, muss es sich um ein Authentifizierungsproblem handeln. Ich glaube jedoch, dass die Authentifizierung lokal mit meinem Azure-Benutzer erfolgt, die ich im Schlüsselsicherungsfach autorisiert habe, und nicht als Azure App Service. 

3
zola25

Es ist zwielichtig, aber das Problem bei Ihrem Setup ist, dass Sie "Autorisierte Anwendung" aktiviert haben, als Sie die Zugriffsrichtlinie für Ihr KeyValut erstellt haben.

Sie können es sehen, weil Sie "Anwendung + Anwendung" auf Ihrem Screenshot haben. Ich kann mir vorstellen, dass Sie die Richtlinie mit Ihrer Webapp erstellt haben, die sowohl die Prinzipal- als auch die autorisierte Anwendung ist. Auf diese Weise entsteht eine Schleife.

Damit diese Einrichtung funktioniert, löschen Sie einfach Ihre bestehende Richtlinie und erstellen Sie eine neue, in der Sie nur den Principal auswählen:

 enter image description here

11
JleruOHeP

Stellen Sie sicher, dass der von Ihnen verwendete Dienstprinzipal hinzugefügt wurde und über die entsprechenden Berechtigungen für die Vorgänge verfügt, die Sie ausführen möchten (Schlüssel/Geheimnisse usw.):

enter image description here

Überprüfen Sie, ob der KeyVault über eingeschränkten Netzwerkzugriff verfügt, und testen Sie, ob dies das Problem ist oder nicht:

enter image description here

1
Ralph Willgoss

nur Principal auswählen und Web-App hinzufügen, autorisierte Anwendung nicht auswählen  enter image description here

1
Viral Jain

Um das Problem zu beheben, musste ich die IP-Adressen der Web-App zur Firewall hinzufügen, da nicht alle hinzugefügt werden, wenn Sie "Zulässige vertrauenswürdige Microsoft-Dienste ..." auswählen.

 outbound ips of the web app

 Azure Key Vault firewall settings

Danke an: https://azidentity.azurewebsites.net/post/2019/01/03/key-vault-firewall-access-by-Azure-app-services

1
Mark Szabo

Ich habe zuvor Probleme wie diese gesehen, bei denen sich Entwicklungs- und Produktionssysteme im Umgang mit Umgebungsvariablen nicht gleich verhalten.

In diesen Szenarien sollten Sie zunächst prüfen, ob Sie in Ihrem Produktionssystem ASPNETCORE_ den Umgebungsvariablen ordnungsgemäß vorangestellt haben. Dieses Präfix ist das Standardpräfix für ASP.NET Core-Webhosts.

| Key                                |  Value                     |
|====================================|============================|
| ASPNETCORE_KEYVAULT_ENDPOINT       |  xxxxxxxxxxxxxxxx          |
| ASPNETCORE_MSI_ENDPOINT**          |  xxxxxxxxxxxxxxxx          |
| ASPNETCORE_MSI_SECRET**            |  xxxxxxxxxxxxxxxx          |

** Beachten Sie, dass Sie in Ihrem Code niemals MSI_ENDPOINT oder MSI_SECRET verwenden. Ich sehe Sie nur mit KEYVAULT_ENDPOINT

Wenn Sie das Präfix explizit auf etwas anderes setzen möchten, können Sie das Präfix, das Sie verwenden möchten, als Argument übergeben, wenn Sie den Webhost über die Konfiguration initialisieren.

.AddEnvironmentVariables("ASPNETCORE_"); // choose your own prefix here
0
Svek