在子应用程序中阻止 web.config 继承

6
我们有一个遗留的.NET解决方案,其中包括MVC和WebForms,并且还有一些Web API项目作为网站根目录下的应用程序。显然,这些Web API应用程序将继承网站的web.config设置。
我们还有另一个项目——边界上下文——用于SSO身份验证,它位于相同的根文件夹内,因此也继承了网站的web.config设置。这个边界上下文应用程序是使用.NET Core构建的。
- wwwroot   // .NET Framework
    - API 1 // .NET Framework
    - API 2 // .NET Framework
    - ...
    - SSO / authentication // bounded context, built in .NET Core

我们最近开始使用Azure Key Vault来存储我们的机密,并且为了在本地处理这些机密,我们正在使用secrets.xml文件。所以根网站的web.config如下:...
<configSections>
  <section name="configBuilders" ... />
</configSections>  

<configBuilders>
  <builders>
    <add name="Secrets" optional="false" userSecretsFile="~\secrets.xml" [elided attributes] />
  </builders>
</configBuilders>

<appSettings configBuilders="Secrets">
  <add key="a_key" value="value specified in secrets.xml" />
  ...
</appSettings>

这里的问题是:身份验证有关的项目抛出异常,因为它找不到 Microsoft.Configuration.ConfigurationBuilders.UserSecrets 程序集 - 因为它继承了网站的配置,所以需要知道该配置部分的全部内容。
但如果在 .NET Core 身份验证项目中引用 NuGet 包,我会收到以下消息...
“此软件包可能与您的项目不完全兼容。”
...并且自动回滚。
因此,如果无法在 .NET Core 子应用程序中引用 UserSecrets 程序集,则如何使其识别继承的配置文件中的 部分呢?
我还尝试过删除这个元素...
<configSections>
  <section name="configBuilders" />
</configSections>

问题实质是:

  1. 子应用程序需要一个NuGet包,其中定义了 <configBuilders> 元素。
    如果没有...
  2. 子应用程序看到了 <configSections> / <section name="configBuilders" /> 元素,并需要知道这是在哪里定义的。
    或者,我可以从子应用程序中删除那个 <section name="configBuilders" /> 元素,然后...
  3. 子应用程序看到了 <configBuilders> 元素,并需要知道哪个配置部分定义了它。

从根配置文件继承配置,在子应用程序中看到 <configBuilders> 元素,但无法识别它。

2个回答

0
将 WEB API 发布到另一个虚拟目录中。 创建重定向或重写规则,将 Web API 流量路由到该虚拟目录。

0

以下是我们解决这个问题的方法:

  1. 创建一个自定义配置部分,在其中声明秘密。
    警告:为了在自定义配置部分上声明 configBuilders 属性,您还必须声明相应的 SectionHandler<your-custom-config-section> 实现 - 文档在这里
  2. 将此自定义配置部分和自定义 SectionHandler<T> 添加到我们的顶级站点和站点内的 API 项目中,但不包括 .NET Core 构建的 SSO / 认证子应用程序
  3. 在顶级站点中,将自定义配置部分包装在 <location path="." inheritInChildApplications="false"> 中。

缺点是我们必须使用我们的自定义配置管理器获取秘密,而所有非机密应用设置都使用默认的 ConfigurationManager 获取,但我没有发现任何代码异味。


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