如何从外部文件中读取XML appSettings?

3

有很多类似的问题,我已经查看了所有可以找到的问题,但没有发现解决方法。

我将 Google+ 认证的 API 密钥存储在一个 .config 文件中,这个文件位于我的解决方案之外(与解决方案文件夹处于相同级别)。

我试图在 Startup.Auth.cs 中读取这些值,代码如下:

public void ConfigureAuth(IAppBuilder app)
{
    app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
    {
        ClientId = WebConfigurationManager.AppSettings.Get("GoogleClientId"),
        ClientSecret = WebConfigurationManager.AppSettings.Get("GoogleClientSecret")
    });
}

根 Web.config:

<appSettings file="..\Secrets.config"> <!-- Path is correct, relative to Web.config -->
  <add key="webpages:Version" value="3.0.0.0" />
  <add key="webpages:Enabled" value="false" />
  <add key="ClientValidationEnabled" value="true" />
  <add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>

Secrets.config:

<configuration>
  <appSettings>
    <add key="GoogleClientId" value="shh" />
    <add key="GoogleClientSecret" value="shh" />
  </appSettings>
</configuration>
3个回答

2
在我的解决方案之外的 .config 文件中(与解决方案文件夹处于同一级别)。
IIS 应用程序完全不知道其虚拟应用程序文件夹之外的任何文件夹。在 Web 应用程序的上下文中,没有“与解决方案文件同一级别”的概念,因为解决方案文件不会随其一起部署。
如果您想将 appSettings 放在应用程序文件夹之外,您唯一内置的选择是根 web.config 文件或 machine.config 文件,它们都是全局的(但特定于您正在运行的 .NET 框架版本)。请参见 ASP.NET 配置文件层次结构和继承
但是,为了记录,长期管理起来最容易的方法是将应用程序设置保存在应用程序的 web.config 文件中。最终,您需要更改/添加新的 Web 服务器,如果这些设置需要放置在虚拟应用程序文件夹之外,则在那时您可能会花费一些时间苦思冥想为什么设置不再起作用。

我正在遵循这个指南的建议。 - Sinjai
没错,在同一级别上使用它很好。我不想在我的代码库中公开敏感信息,这就是为什么我试图按照Rick Anderson的建议将其放在解决方案之外的原因。 - Sinjai

0
你尝试验证 secrets.config 是否在构建后被复制了吗?
通过右键单击该文件并查看属性,验证文件的构建操作是否设置为始终复制。

0

Secrets.config中删除<configuration>...</configuration>标签

Secrets.config:

<appSettings>
  <add key="GoogleClientId" value="shh" />
  <add key="GoogleClientSecret" value="shh" />
</appSettings>

基本上,您可以将appSettings部分作为外部Secrets.config文件的根。

对于连接字符串,可以使用configSource属性执行相同的操作,但是...

安全性 - 与Secrets.config文件不同,外部连接字符串文件必须位于根web.config文件的相同目录中,因此您必须采取预防措施以确保您不会将其检入源代码库。

还可以尝试使用ConfigurationManager

app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
{
    ClientId = ConfigurationManager.AppSettings["GoogleClientId"],
    ClientSecret = ConfigurationManager.AppSettings["GoogleClientSecret"]
});

参考我学习相关知识的文章

Scott Hanselman

ASP.NET和Azure中配置私有配置数据和连接字符串的最佳实践

官方MS文档

将密码和其他敏感数据部署到ASP.NET和Azure应用服务的最佳实践


那样做不行。 - Sinjai
仅用于故障排除。当它们处于同一级别时,它是否有效?只是想排除它可以工作的可能性。在我的生产环境中也有相同的情况,但在我的情况下,文件位于同一根目录下。 - Nkosi
是的,如果它们在同一级别上,它确实有效。只是觉得教程有些不对。 - Sinjai
记住,如果找不到文件,它就无法工作。尝试小步骤。向上一级文件夹并继续尝试,逐步确认文件路径。 - Nkosi
嗯,是的,只有一个步骤需要完成,而且这就是最初的目标。 - Sinjai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接