azure - 在 Azure Key Vault 配置 ASP.NET Core 3.1 后,以调试方式启动我的网站无法正常工作

标签 azure azure-web-app-service asp.net-core-3.1 azure-keyvault azure-authentication

我有一个功能齐全的网站。昨天,我使用 Azure Key Vault 服务绑定(bind)了我的 secret 。 在我的 secret 中,我只存储 SendGridKey 和 EmailKey。 以下依赖项已添加到我的 csproj 文件中:

<PackageReference Include="Azure.Extensions.AspNetCore.Configuration.Secrets" Version="1.0.2" />
<PackageReference Include="Azure.Identity" Version="1.3.0" />
<PackageReference Include="Azure.Security.KeyVault.Secrets" Version="4.1.0" />

我的 Program.cs 文件已自动更新,如下所示:

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, config) =>
                {
                    var keyVaultEndpoint = new Uri(Environment.GetEnvironmentVariable("MyKeyVault"));
                    config.AddAzureKeyVault(
                    keyVaultEndpoint,
                    new DefaultAzureCredential());
                })
            .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();

                });

在 Azure 中发布网站仍然可以完美运行,但我无法以 Debug模式启动我的网站。

我收到以下错误:

An error occurred while starting the application.
ArgumentNullException: Value cannot be null. (Parameter 'uriString')
System.Uri..ctor(string uriString)
ArgumentNullException: Value cannot be null. (Parameter 'uriString')

问题是:

var keyVaultEndpoint = new Uri(Environment.GetEnvironmentVariable("MyKeyVault"));

因为 Environment.GetEnvironmentVariable("MyKeyVault") 返回 NULL

我的启动文件是:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

        var options = new RewriteOptions()
            .AddRedirectToWwwPermanent()
            .AddRedirectToHttpsPermanent();

        app.UseRewriter(options);

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

有什么建议吗?

更新

我有一个类似的项目,具有以下代码块:

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, config) =>
            {
                var keyVaultEndpoint = GetKeyVaultEndpoint();
                if (!string.IsNullOrEmpty(keyVaultEndpoint))
                {
                    var azureServiceTokenProvider = new AzureServiceTokenProvider();
                    var keyVaultClient = new KeyVaultClient(
                        new KeyVaultClient.AuthenticationCallback(
                            azureServiceTokenProvider.KeyVaultTokenCallback));
                    config.AddAzureKeyVault(keyVaultEndpoint, keyVaultClient, new DefaultKeyVaultSecretManager());
                }
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
    private static string GetKeyVaultEndpoint() => "https://mykeyvault.vault.azure.net/";

我使用了以下软件包:

<PackageReference Include="Azure.Extensions.AspNetCore.Configuration.Secrets" Version="1.0.0" />
<PackageReference Include="Azure.Identity" Version="1.1.1" />
<PackageReference Include="Microsoft.Azure.KeyVault.Core" Version="3.0.5" />
<PackageReference Include="Microsoft.Azure.Services.AppAuthentication" Version="1.6.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.1.8" />
<PackageReference Include="SendGrid" Version="9.21.0" />

Microsoft.Azure.Services.AppAuthentication 已被弃用,上述代码在我的新项目中不再有效。它在我的旧设备上确实有效。

最佳答案

通过这几行代码,它在开发和生产中再次起作用:

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, config) =>
                {
                    if (context.HostingEnvironment.IsDevelopment())
                    {

                        // Do simply nothing
                    }
                    else
                    {
                        var keyVaultEndpoint = new Uri(Environment.GetEnvironmentVariable("MyKeyVault"));
                        config.AddAzureKeyVault(
                        keyVaultEndpoint,
                        new DefaultAzureCredential());
                    }
                                           
                })
            .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

在开发中, secret 是从 secrets.json 中检索的,在生产中是从 Azure KeyVault 中检索的。

关于azure - 在 Azure Key Vault 配置 ASP.NET Core 3.1 后,以调试方式启动我的网站无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66661574/

相关文章:

asp.net-core-3.1 - INodeServices 已过时 : Use Microsoft. AspNetCore.SpaServices.Extensions

Azure DevOps AzCopy 身份验证失败,它要么不正确,要么已过期,或者没有正确的权限

Azure 计时器函数在触发器上运行多次

c# - Azure Web App 部署 msdeploy 包时出现错误

带有应用服务 Web 应用的 Azure 应用程序网关

c# - 用加号解码字符串

visual-studio - 配置负载测试的每秒请求数

azure - 失败的测试不会使 YAML 中的任务失败

azure - 我在 Azure 中创建了一个 Web 应用程序,并向其中添加了一个取自 Cloudflare 的自定义域

asp.net-core - .NET Core 3.1 WebApi 项目 + NTLM 认证