在子应用程序中阻止 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>
元素并且无法识别它。
所以问题归结为:
- 子应用程序需要一个 NuGet 包,其中定义了
<configBuilders>
元素。
如果不是...
- 子应用程序看到
<configSections>
/ <section name="configBuilders" />
元素并且需要知道这是在哪里定义的。
或者,我删除子应用程序中的 <section name="configBuilders" />
元素,然后...
- 子应用程序看到
<configBuilders>
元素,需要知道哪个配置部分定义了它。
在另一个虚拟目录中发布 WEB API。
创建重定向或重写规则以将 Web API 流量路由到此虚拟目录。
以下是我们解决这个问题的方法:
- 创建了一个自定义配置部分,我们在其中声明了秘密。
警告任何遵循此内容的人:为了在自定义配置部分声明 configBuilders
属性,您还必须声明 SectionHandler<your-custom-config-section>
- here's the documentation. 的相应实现
- 将此自定义配置部分和自定义
SectionHandler<T>
添加到我们的顶级站点和站点内的 API 项目, 但不添加到 .NET Core 构建的项目SSO/认证子应用.
- 在顶级站点中,将自定义配置部分包装在
<location path="." inheritInChildApplications="false">
中。
缺点是我们必须使用自定义配置管理器获取机密,而所有非机密应用程序设置均使用默认 ConfigurationManager
获取,但我没有检测到任何代码味道关于这个。
我们有一个遗留的 .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>
元素并且无法识别它。
所以问题归结为:
- 子应用程序需要一个 NuGet 包,其中定义了
<configBuilders>
元素。
如果不是... - 子应用程序看到
<configSections>
/<section name="configBuilders" />
元素并且需要知道这是在哪里定义的。
或者,我删除子应用程序中的<section name="configBuilders" />
元素,然后... - 子应用程序看到
<configBuilders>
元素,需要知道哪个配置部分定义了它。
在另一个虚拟目录中发布 WEB API。 创建重定向或重写规则以将 Web API 流量路由到此虚拟目录。
以下是我们解决这个问题的方法:
- 创建了一个自定义配置部分,我们在其中声明了秘密。
警告任何遵循此内容的人:为了在自定义配置部分声明configBuilders
属性,您还必须声明SectionHandler<your-custom-config-section>
- here's the documentation. 的相应实现
- 将此自定义配置部分和自定义
SectionHandler<T>
添加到我们的顶级站点和站点内的 API 项目, 但不添加到 .NET Core 构建的项目SSO/认证子应用. - 在顶级站点中,将自定义配置部分包装在
<location path="." inheritInChildApplications="false">
中。
缺点是我们必须使用自定义配置管理器获取机密,而所有非机密应用程序设置均使用默认 ConfigurationManager
获取,但我没有检测到任何代码味道关于这个。