当前位置: 首页 > 知识库问答 >
问题:

“HTTP错误502.5-进程失败”使用ASP.NET Core 2.1 WebAPI访问Azure PaaS中的Azure密钥库

毛淳
2023-03-14

尝试使用托管服务标识访问Azure密钥库时,收到错误“HTTP错误502.5-进程失败”/“操作返回无效状态代码‘禁止’”。它在Visual Studio中调试时可以工作,但当发布到Azure web应用程序时,它返回502.5错误。

az keyvault secret set --vault-name 'mytestkeyvault' --name 'Secret1' --value 'Hello'
az keyvault secret set --vault-name 'mytestkeyvault' --name 'Secret2' --value 'Goodbye'

在Azure中创建一个web应用程序。启用托管服务标识。

添加NuGet包:

  • aspnetcore.keyvault
  • Microsoft.Azure.Services.AppAuthentication
{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "AppSettings": {
    "KeyVaultURL": "https://mytestkeyvault.vault.azure.net/"
  }
}
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

namespace MyKeyVaultTest.Service
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((context, config) =>
                {
                    IConfigurationRoot builtConfig = config.Build();
                    ConfigurationBuilder keyVaultConfigBuilder = new ConfigurationBuilder();
                    keyVaultConfigBuilder.AddAzureKeyVault(builtConfig["AppSettings:KeyVaultURL"]);
                    IConfigurationRoot keyVaultConfig = keyVaultConfigBuilder.Build();
                    config.AddConfiguration(keyVaultConfig);
                })
                .UseStartup<Startup>();
    }
}
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using System.Collections.Generic;

namespace MyKeyVaultTest.Service.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        private readonly IConfiguration _configuration;

        public ValuesController(IConfiguration configuration)
        {
            _configuration = configuration;
        }

        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            string secret1 = _configuration["Secret1"];
            string secret2 = _configuration["Secret2"];

            return new string[] { secret1, secret2 };
        }        
    }
}
["Hello","Goodbye"]

HTTP错误502.5-进程失败

错误的完整堆栈:

Description: The process was terminated due to an unhandled exception.
Exception Info: 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 MyKeyVaultTest.Service.Program.&lt;&gt;c.&lt;CreateWebHostBuilder&gt;b__1_0(WebHostBuilderContext context, IConfigurationBuilder config) in D:\a\1\s\MyKeyVaultTest\MyKeyVaultTest.Service\Program.cs:line 27
   at Microsoft.AspNetCore.Hosting.WebHostBuilder.BuildCommonServices(AggregateException&amp; hostingStartupErrors)
   at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
   at MyKeyVaultTest.Service.Program.Main(String[] args) in D:\a\1\s\MyKeyVaultTest\MyKeyVaultTest.Service\Program.cs:line 17

共有1个答案

亢建白
2023-03-14

在Web应用程序中启用托管服务标识将创建一个在Azure中使用的标识。您仍然需要授予该身份对密钥库的必要权限。

在Web应用程序中启用MSI后,它将显示为可以在密钥库的权限配置中分配权限的用户。

 类似资料:
  • 在Microsoft.azure.services.appauthentication.azureSeviceTokenProvider.getAccessStokenAsyncimpl(字符串权限、字符串资源、字符串范围)在Microsoft.azure.keyvault.keyvault.keyvaultCredential.postAuthenticate(HttpResponseMessa

  • 是否有一种方法可以使用Delphi访问Azure密钥库?我可以使用柏林的data.cloud.azureapi单元访问数据库和blob存储,但想从密钥库中获取数据库连接字符串,但似乎找不到任何用于此操作的代码。

  • 我正在python中构建由事件网格事件触发的Azure函数,它应该能够从Kay Vault收集秘密。 我将系统分配的托管标识添加到我的功能应用程序中,然后我可以在密钥库访问策略中选择我的应用程序。我授予它如下所示的权限: (我尝试了不同的组合在这一个)

  • 我已经能够通过外部web应用程序使用oauth rest api访问azure key vault,但出于某种原因,我无法从密钥中检索机密。经过长时间的研究,我发现用powershell和C#可以做到这一点,但还没有找到用Python解决方案。有人知道python是否有可能,或者有一种方法可以模拟powershell正在做什么吗?以下是检索秘密的代码: 此外,我已经在azure portal中注册

  • 由于我是Azure的新手,这个问题可能很傻。我正在尝试构建一个提供和管理虚拟机集群的服务。出于安全考虑,我不想在每个集群上放一些敏感数据。因此我决定为每个集群提供一个Azure密钥库来存储这些数据,并创建一个MSI(managed identity)并分派给集群的每个节点,这样vm就可以访问密钥库来获取机密。 在服务端,我需要提供vms、密钥库和MSI。将MSI分配给每个VM,同时授予MSI访问A

  • 我在大多数文章中读到,需要在Azure中部署应用程序,这样应用程序才能以编程方式访问存储在Azure密钥库中的秘密。 有没有一种方法可以不在azure中部署应用程序,并且仍然能够通过使用客户端id和客户端机密或证书来访问azure密钥库以获取机密?