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

Blocking web.config inheritance in a sub-application

我们有一个遗留的 .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>

这是问题所在:Authentication 有界上下文项目抛出异常,因为它找不到 Microsoft.Configuration.ConfigurationBuilders.UserSecrets 程序集 - 因为它继承了它需要的网站配置知道那个配置部分是关于什么的。

但是如果在 .NET Core authentication 项目中引用该 NuGet 包,我会收到消息...

This package may not be fully compatible with your project.

...它会自动回滚。

因此,如果我无法在 .NET Core 子应用程序中引用 UserSecrets 程序集,那么我如何才能让它识别继承的配置文件中的 <configBuilders> 部分?

我也试过删除元素...

<configSections>
  <section name="configBuilders" />
</configSections>

...来自根配置文件,但子应用程序随后看到 <configBuilders> 元素并且无法识别它。

所以问题归结为:

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

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

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

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

缺点是我们必须使用自定义配置管理器获取机密,而所有非机密应用程序设置均使用默认 ConfigurationManager 获取,但我没有检测到任何代码味道关于这个。