Блокировка наследования web.config в субприложении

У нас есть устаревшее решение.NET, которое сочетает в себе компоненты MVC и WebForms, а также некоторые проекты веб-API в виде приложений в корне веб-сайта. Очевидно, что эти приложения веб-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 сборка - поскольку она наследует конфигурацию веб-сайта, ей необходимо знать, о чем этот раздел конфигурации.

Но если ссылаться на этот пакет NuGet в проекте проверки подлинности.NET Core, я получаю сообщение...

Этот пакет может быть не полностью совместим с вашим проектом.

... и автоматически откатывается.

Итак, если я не могу сослаться на UserSecrets сборки в подприложении.NET Core, то как я могу заставить его распознавать <configBuilders> раздел в унаследованном файле конфигурации?

Я также пробовал удалить элемент...

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

... из корневого файла конфигурации, но затем субприложение видит <configBuilders> элемент и не распознает его.

Итак, проблема сводится к следующему:

  1. Подприложению требуется пакет NuGet, в котором <configBuilders>элемент определен.
    Если не...
  2. Под-приложение видит <configSections> / <section name="configBuilders" />элемент и должен знать, где он определен.
    Или я удаляю это<section name="configBuilders" /> элемент в дополнительном приложении, а затем...
  3. Под-приложение видит <configBuilders> элемент и должен знать, какой раздел конфигурации определяет это.

2 ответа

Решение

Вот как мы решили эту проблему:

  1. Создал настраиваемый раздел конфигурации, в котором мы объявляем секреты.
    Предупреждение для всех, кто следит за этим: Чтобы объявитьconfigBuilders в настраиваемом разделе конфигурации, вы также должны объявить соответствующую реализацию SectionHandler<your-custom-config-section>- вот документация.
  2. Добавлен этот настраиваемый раздел конфигурации и настраиваемый SectionHandler<T>к нашему сайту верхнего уровня и проектам API внутри сайта, но не к приложению SSO / аутентификации, построенному на.NET Core.
  3. На сайте верхнего уровня обернул настраиваемый раздел конфигурации в <location path="." inheritInChildApplications="false">.

Обратной стороной этого является то, что мы должны получать секреты с помощью нашего настраиваемого диспетчера конфигураций, в то время как все несекретные настройки приложения получаются с использованием значения по умолчанию. ConfigurationManager, но я не чувствую запаха кода по этому поводу.

Опубликуйте WEB API в другом виртуальном каталоге. Создайте правила перенаправления или перезаписи для маршрутизации трафика веб-API в этот виртуальный каталог.

Другие вопросы по тегам