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

get*_*ode 11 c# asp.net-core asp.net-core-2.0

注意:此问题现已解决 - 请参阅下面的更新3以获取解决方案.

我有一个ASP.NET Core 2 Web应用程序,需要连接到SQL Server数据库.根据我在下面的更新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();
Run Code Online (Sandbox Code Playgroud)

我的BuildWebHost方法看起来像这样:

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

我的appSettings.json文件有这个部分:

{
  "ConnectionStrings": {
    "DefaultConnection": "*****" // secret
  }
}
Run Code Online (Sandbox Code Playgroud)

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

有了这一切,我的代码抛出了关于连接字符串格式的异常.但是,如果我用我的主appSettings.json文件中的"*****"替换真实的连接字符串,应用程序工作正常.所以我认为它没有加载我的用户机密.

现在,我认为使用AddUserSecrets传递参数的重载false将导致代码中断,如果无法加载用户机密.但它并没有打破这里.我不确定我还能做什么.什么会导致ASP.NET Core无法加载用户机密?

更新1

调试时,我可以,它有3个提供商,我期望我的配置属性里面看到:appsettings.json,appsettings.Development.json,和secrets.json.但是,秘密提供程序的文件根目录是我的调试路径,而不是我的秘密文件的位置,即C:\ Users [用户名]\AppData\Roaming\Microsoft\UserSecrets ...

在此输入图像描述

更新2

我已经意识到Web项目的Debug设置指向一个IIS站点,该站点使用在ApplicationPoolIdentity用户下运行的应用程序池.这是否意味着用户机密需要在C:\ Users [app-pool-user]\AppData\Roaming\Microsoft\UserSecrets而不是我自己的用户帐户?我已经尝试将GUID命名的secrets.json文件夹复制到此位置,但这没有帮助.我有,但是,试图改变下IIS Express和这一次的用户秘密运行加载.但由于种种原因,我需要能够在一个特定的域名来调试这个应用程序,所以我怎样才能让我的用户秘密,在我的IIS的上下文加载?我尝试更改应用程序池以使用我的主要Windows用户而不是,AppPoolIdentity但这没有帮助.

更新3:解决了

好吧,我今天学到了一些东西!最终这是解决我的问题的答案,但不是我预期的方式.我转移了我的原始问题 - 加载用户机密 - 因为我通过在IIS上托管实现我基本上使用部署而不是临时调试会话.所以我将我的用户机密信息移到环境变量中(例如在我的连接字符串示例中,添加系统环境变量ConnectionStrings:DefaultConnection)并添加AddEnvironmentVariables()到我的配置设置中.但我仍然发现由于某些原因这些没有被加载到我的配置中.最后,我发现感谢这篇SO帖子,IIS有一个地方可以添加隐藏在名为Configuration Editor的东西深处的本地环境变量.在这里添加我的变量解决了这个问题,这意味着我现在可以在IIS中本地托管和调试,同时保证我的秘密安全.

小智 7

简短的回答 - 在 IIS 下,工作进程将有自己的“%APPDATA%”环境变量。在我的桌面上,它是“C:\ WINDOWS \ system32 \ config \ systemprofile \ AppData \ Roaming”如果我然后将带有我的秘密的目录复制到此处并授予适当的asp.net工作进程(例如“IIS AppPool \ AppPoolName” -替换您的应用程序池名称)对此目录的读取权限然后它应该可以工作。

更长的答案

感谢开源的奇迹,您可以在这里找到代码 - https://github.com/dotnet/aspnetcore/blob/52eff90fbcfca39b7eb58baad597df6a99a542b0/src/Tools/dotnet-user-secrets/src/Internal/SecretsStore.cs

当您查看此内容时,您可以明白为什么 @kraihn 的答案有效 - 如果目录不存在(或由于权限而无法读取 - 这让我困惑了一段时间),则“fileProvider”设置为 null - 所以它看起来在应用程序目录中 - 就像其他配置文件一样。

目录本身在“PathHelper”(https://github.com/aspnet/Extensions/blob/master/src/Configuration/Config.UserSecrets/src/PathHelper.cs)中设置 - 但只要有一个“ APPDATA”设置它会拾取它。

您可以使用 sysinternals 检查目录是否存在来验证所有这些 -

15:04:16.0759461    w3wp.exe    26308   CreateFile  C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft\UserSecrets\c89b3c54-eda4-4b3b-97ca-b7d3d3699622 SUCCESS Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
15:04:16.0759965    w3wp.exe    26308   QueryNetworkOpenInformationFile C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft\UserSecrets\c89b3c54-eda4-4b3b-97ca-b7d3d3699622 SUCCESS CreationTime: 27/12/2019 14:31:05, LastAccessTime: 27/12/2019 14:31:05, LastWriteTime: 27/12/2019 14:31:05, ChangeTime: 27/12/2019 15:03:45, AllocationSize: 01/01/1601 00:00:00, EndOfFile: 01/01/1601 00:00:00, FileAttributes: D
15:04:16.0760114    w3wp.exe    26308   CloseFile   C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft\UserSecrets\c89b3c54-eda4-4b3b-97ca-b7d3d3699622 SUCCESS 
15:04:16.0762556    w3wp.exe    26308   CreateFile  C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft\UserSecrets\c89b3c54-eda4-4b3b-97ca-b7d3d3699622 SUCCESS Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
15:04:16.0762940    w3wp.exe    26308   QueryNetworkOpenInformationFile C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft\UserSecrets\c89b3c54-eda4-4b3b-97ca-b7d3d3699622 SUCCESS CreationTime: 27/12/2019 14:31:05, LastAccessTime: 27/12/2019 14:31:05, LastWriteTime: 27/12/2019 14:31:05, ChangeTime: 27/12/2019 15:03:45, AllocationSize: 01/01/1601 00:00:00, EndOfFile: 01/01/1601 00:00:00, FileAttributes: D
15:04:16.0763067    w3wp.exe    26308   CloseFile   C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft\UserSecrets\c89b3c54-eda4-4b3b-97ca-b7d3d3699622 SUCCESS 
Run Code Online (Sandbox Code Playgroud)

读取配置文件机密文件不是从 IIS 目录中读取的。

15:04:16.0759461    w3wp.exe    26308   CreateFile  C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft\UserSecrets\c89b3c54-eda4-4b3b-97ca-b7d3d3699622 SUCCESS Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
15:04:16.0759965    w3wp.exe    26308   QueryNetworkOpenInformationFile C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft\UserSecrets\c89b3c54-eda4-4b3b-97ca-b7d3d3699622 SUCCESS CreationTime: 27/12/2019 14:31:05, LastAccessTime: 27/12/2019 14:31:05, LastWriteTime: 27/12/2019 14:31:05, ChangeTime: 27/12/2019 15:03:45, AllocationSize: 01/01/1601 00:00:00, EndOfFile: 01/01/1601 00:00:00, FileAttributes: D
15:04:16.0760114    w3wp.exe    26308   CloseFile   C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft\UserSecrets\c89b3c54-eda4-4b3b-97ca-b7d3d3699622 SUCCESS 
15:04:16.0762556    w3wp.exe    26308   CreateFile  C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft\UserSecrets\c89b3c54-eda4-4b3b-97ca-b7d3d3699622 SUCCESS Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
15:04:16.0762940    w3wp.exe    26308   QueryNetworkOpenInformationFile C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft\UserSecrets\c89b3c54-eda4-4b3b-97ca-b7d3d3699622 SUCCESS CreationTime: 27/12/2019 14:31:05, LastAccessTime: 27/12/2019 14:31:05, LastWriteTime: 27/12/2019 14:31:05, ChangeTime: 27/12/2019 15:03:45, AllocationSize: 01/01/1601 00:00:00, EndOfFile: 01/01/1601 00:00:00, FileAttributes: D
15:04:16.0763067    w3wp.exe    26308   CloseFile   C:\Windows\System32\config\systemprofile\AppData\Roaming\Microsoft\UserSecrets\c89b3c54-eda4-4b3b-97ca-b7d3d3699622 SUCCESS 
Run Code Online (Sandbox Code Playgroud)


小智 6

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

  • 哇。这似乎完全否定了机密文件的要点。 (3认同)