调试IIS网站时,ASP.NET Core 2 Web应用程序不会加载用户机密

ASP.NET Core 2 web application isn#39;t loading user secrets when debugging IIS website(调试IIS网站时,ASP.NET Core 2 Web应用程序不会加载用户机密)

本文介绍了调试IIS网站时,ASP.NET Core 2 Web应用程序不会加载用户机密的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

注意:此问题现已解决-有关解决方案,请参阅下面的更新3

我有一个需要连接到SQL Server数据库的ASP.NET Core 2 Web应用程序。根据我下面的更新2,我正在使用IIS调试应用程序。

我正在Program类中加载配置(因为我需要它来设置日志记录),如下所示:

public static IConfiguration Configuration => new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddJsonFile($"appsettings.{EnvName ?? "Production"}.json", optional: true)
    .AddUserSecrets<Startup>(false)
    .Build();

我的BuildWebHost方法如下:

public static IWebHost BuildWebHost(string[] args)
{
    return WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseConfiguration(Configuration)
        .UseSerilog()
        .Build();
}

我的appSettings.json文件有此节:

{
  "ConnectionStrings": {
    "DefaultConnection": "*****" // secret
  }
}

我已使用Visual Studio中的上下文菜单将用户机密文件添加到项目中,复制了上面的部分,但使用了真实的连接字符串。

有了这些,我的代码抛出了一个关于连接字符串格式的异常。但是,如果我将主appSettings.json文件中的"*"替换为实际的连接字符串,应用程序就能正常工作。因此,我假设它没有加载我的用户机密。

现在,我认为如果无法加载用户机密,使用AddUserSecrets传递参数false的重载会导致代码崩溃。但它并没有在这里被打破。我不知道我还能做什么。是什么原因导致ASP.NET核心无法加载用户机密?

更新1

调试时,我可以在我的配置属性中看到它有我期望的3个提供程序:appsettings.jsonappsettings.Development.jsonsecrets.json。但是,机密提供程序的文件根目录是我的调试路径,而不是我的机密文件的位置,即C:Users[username]AppDataRoamingMicrosoftUserSecrets...

更新2

我意识到Web项目的Debug设置指向一个IIS站点,该站点使用在ApplicationPoolIdentity用户下运行的应用程序池。这是否意味着用户机密需要在C:Users[app-pool-user]AppDataRoamingMicrosoftUserSecrets下,而不是我自己的用户帐户下?我曾尝试将GUID名为securs.json的文件夹复制到此位置,但无济于事。但是,我尝试更改为在IIS Express下运行,这一次加载了用户机密。但是由于各种原因,我需要能够在特定域名下调试此应用程序,那么我如何才能将我的用户机密加载到我的IIS上下文中呢?我已尝试将应用程序池更改为使用我的主Windows用户,而不是AppPoolIdentity,但这无济于事。

更新3:已解决

好吧,我今天学到了一些东西!最终是the answer here解决了我的问题,但并不是以我预期的方式。我从最初的问题--加载用户机密--转移到另一个问题上,因为我意识到,通过托管在IIS上,我基本上是在处理部署而不是临时调试会话。因此,我将用户机密移至环境变量(例如,在我的连接字符串示例中,添加了一个系统环境变量ConnectionStrings:DefaultConnection),并将AddEnvironmentVariables()添加到我的配置设置中。但我仍然发现,出于某种原因,这些没有加载到我的配置中。最后,多亏了this SO post,我发现IIS有一个地方可以添加隐藏在配置编辑器中的本地环境变量。在此处添加变量解决了问题,这意味着我现在可以在IIS中本地承载和调试,同时保护我的机密安全。

推荐答案

我发现在IIS下运行时,Securs.json应该在站点的物理路径中。

这篇关于调试IIS网站时,ASP.NET Core 2 Web应用程序不会加载用户机密的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:调试IIS网站时,ASP.NET Core 2 Web应用程序不会加载用户机密