Блокировка наследования 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>
элемент и не распознает его.
Итак, проблема сводится к следующему:
- Подприложению требуется пакет NuGet, в котором
<configBuilders>
элемент определен.
Если не... - Под-приложение видит
<configSections>
/<section name="configBuilders" />
элемент и должен знать, где он определен.
Или я удаляю это<section name="configBuilders" />
элемент в дополнительном приложении, а затем... - Под-приложение видит
<configBuilders>
элемент и должен знать, какой раздел конфигурации определяет это.
2 ответа
Вот как мы решили эту проблему:
- Создал настраиваемый раздел конфигурации, в котором мы объявляем секреты.
Предупреждение для всех, кто следит за этим: Чтобы объявитьconfigBuilders
в настраиваемом разделе конфигурации, вы также должны объявить соответствующую реализациюSectionHandler<your-custom-config-section>
- вот документация. - Добавлен этот настраиваемый раздел конфигурации и настраиваемый
SectionHandler<T>
к нашему сайту верхнего уровня и проектам API внутри сайта, но не к приложению SSO / аутентификации, построенному на.NET Core. - На сайте верхнего уровня обернул настраиваемый раздел конфигурации в
<location path="." inheritInChildApplications="false">
.
Обратной стороной этого является то, что мы должны получать секреты с помощью нашего настраиваемого диспетчера конфигураций, в то время как все несекретные настройки приложения получаются с использованием значения по умолчанию. ConfigurationManager
, но я не чувствую запаха кода по этому поводу.
Опубликуйте WEB API в другом виртуальном каталоге. Создайте правила перенаправления или перезаписи для маршрутизации трафика веб-API в этот виртуальный каталог.