问题描述
注意:此问题现已解决-有关解决方案,请参阅下面的更新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.json
、appsettings.Development.json
和secrets.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应用程序不会加载用户机密的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!