Безопасное хранение секретов конфигурации¶
В работе любого нетривиального приложения требуется использование неких конфиденциальных данных, например пароля или API-ключа. В отличие от прочих настроек их ни в коем случае нельзя хранить в системе контроля версий, следовательно, их нужно хранить где-то вовне папки проекта.
Самые часто используемые подходы здесь такие:
- User Secrets Manager для локальных значений (например, в процессе разработки)
- переменные окружения на серверах
- Специальные платформы типа Azure Key Vault или Hashicorp Vault, хотя и тут придётся использовать один из двух предыдущих подходов для хранения информации о подключении к ним.
Рассмотрим первые два варианта подробнее.
Сохранение секретов в переменных окружения в промышленном окружении¶
Для добавления поставщика конфигурации переменных окружения используется метод AddEnvironmentVairables, как было показано здесь. Он добавляет все переменные окружения в виде пар “ключ-значение” в объекте конфигурации.
Для создания иерархических разделов можно использовать двоеточие (:) или двойное подчёркивание (__) для разграничения секций, например MapSettings:MaxNumberOfPoints или MapSettings__MaxNumberOfPoints. Для некоторых окружений, например, под Linux, двоеточие в переменных окружения не допускается. При импорте в объект IConfiguration двойное подчёркивание будет преобразовано в двоеточие, так что при получении значений в коде следует обязательно использовать двоеточие.
Хранение секретов с помощью менеджера пользовательских секретов в окружении разработки¶
Для того, чтобы использовать Менеджер пользовательских секретов (User Secrets Manager), его нужно настроить, добавить поставщика конфигурации User Secrets, если не используется метод Host.CreatedefaultBuilder(), и определить уникальный ключ для приложения.
Для этого: в VS щелкаем проект правой кнопкой мыши и выбираем Manage User Secrets, после чего откроется файл secrets.json, который нужно отредактировать. Также при этом создастся уникальный идентификатор в файле .csproj:
<PropertyGroup>
<UserSecretsId>c81ee9bd-6924-46d9-ba81-e39eeaa0da91</UserSecretsId>
</PropertyGroup>
Также можно воспользоваться командной строкой (однако при этом идентификатор в файл .cspoj нужно добавить самостоятельно):
Теперь, чтобы воспользоваться этими секретами, нужно добавить поставщика:
Как мы понимаем, правильно добавлять его только для окружения разработки.
У этого метода есть несколько перегрузок; идея в том, что поставщик должен получить значение
UserSecretsId. Использованная перегрузка использует класс Startup для указания на сборку, содержащую это свойство.
Дата создания : 30 сентября 2022 г.