[英]Blocking web.config inheritance in a sub-application
我們有一個遺留的 .NET 解決方案,它結合了 MVC 和 WebForms 的東西,以及一些 Web API 項目作為網站根目錄下的應用程序。 顯然,這些 Web API 應用程序將繼承網站的 web.config 設置。
我們還有另一個項目 - 有界上下文 - 用於 SSO 身份驗證,它位於同一根文件夾內,因此也繼承了網站的 web.config 設置。 這個限界上下文應用程序是使用 .NET 核心構建的。
- 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 核心身份驗證項目中引用 NuGet package,我會收到消息...
此 package 可能與您的項目不完全兼容。
...它會自動回滾。
因此,如果我無法在 .NET Core 子應用程序中引用UserSecrets
程序集,那么如何讓它識別繼承的配置文件中的<configBuilders>
部分?
我也試過刪除元素......
<configSections>
<section name="configBuilders" />
</configSections>
...來自根配置文件,但子應用程序隨后會看到<configBuilders>
元素並且無法識別它。
所以問題歸結為:
<configBuilders>
元素。<configSections>
/ <section name="configBuilders" />
元素並且需要知道它是在哪里定義的。<section name="configBuilders" />
元素,然后...<configBuilders>
元素並且需要知道哪個配置部分定義了它。在另一個虛擬目錄中發布 WEB API。 創建重定向或重寫規則以將 Web API 流量路由到此虛擬目錄。
以下是我們解決此問題的方法:
configBuilders
屬性,您還必須聲明SectionHandler<your-custom-config-section>
的相應實現 - 這是文檔。SectionHandler<T>
添加到我們的頂級站點和站點內的 API 項目,但不添加到 .NET 核心構建的 SSO / 身份驗證子應用程序。<location path="." inheritInChildApplications="false">
中。 <location path="." inheritInChildApplications="false">
。 這樣做的缺點是我們必須使用我們的自定義配置管理器獲取機密,而所有非機密應用程序設置都是使用默認ConfigurationManager
獲取的,但我沒有檢測到任何關於此的代碼氣味。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.