簡體   English   中英

在子應用程序中阻止 web.config inheritance

[英]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>元素並且無法識別它。

所以問題歸結為:

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

在另一個虛擬目錄中發布 WEB API。 創建重定向或重寫規則以將 Web API 流量路由到此虛擬目錄。

以下是我們解決此問題的方法:

  1. 創建了一個自定義配置部分,我們在其中聲明了秘密。
    對以下任何人的警告說明:為了在自定義配置部分上聲明configBuilders屬性,您還必須聲明SectionHandler<your-custom-config-section>的相應實現 - 這是文檔
  2. 將此自定義配置部分和自定義SectionHandler<T>添加到我們的頂級站點和站點內的 API 項目,但不添加到 .NET 核心構建的 SSO / 身份驗證子應用程序
  3. 在頂級站點中,將自定義配置部分包裝在<location path="." inheritInChildApplications="false">中。 <location path="." inheritInChildApplications="false">

這樣做的缺點是我們必須使用我們的自定義配置管理器獲取機密,而所有非機密應用程序設置都是使用默認ConfigurationManager獲取的,但我沒有檢測到任何關於此的代碼氣味。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM