2016-12-28 9 views
1

Я задаюсь общую конвенцию для хранения информации о конфигурации, связанной с полями ниже 2 проблем ниже:Где лучше всего хранить конфигурационную информацию в приложении ASP.NET MVC?

A> проблема безопасности

B> Обновление концерна (в случае конфигурации должен быть обновлен пользователем, а не разработчиком).

1) Я определяю информацию о строках базы данных базы данных (базу данных, пользователя и пароль) в web.config. Есть ли другой способ, например, хранить в cs-файле? Я думаю, что невозможно сохранить его в той же базе данных, в которой используется приложение.

2) Мое приложение отправляет электронное письмо, и я определяю учетные данные в классе электронной почты * .cs. Это правда? Принимая во внимание, что эта информация изменена, и нет поддержки разработчика, рекомендуется ли хранить их в базе данных и разрешать пользователям обновлять их через приложение?

3) Каковы подходы ко всем сценариям (config, update и * .cs file)? Например, если вы сохраняете учетные данные электронной почты в базе данных, я должен получить эту информацию из базы данных непосредственно перед использованием? Или существует другой подход, то есть запись его во временный файл, а затем его повторное использование до его изменения в базе данных и т. Д.)

Любая помощь будет оценена.

+0

Я вообще отказался от хранения конфиденциальной информации в своем приложении и вместо этого теперь использую службы, чтобы сохранить это для меня. В моем случае я использую Key Vault от Azure, а затем при запуске приложения загружаю настройки в память. –

+0

@ AndrésNava-.NET Спасибо за сообщение. Но я не хочу использовать сторонний инструмент или систему, и у меня есть 3 варианта: web.config (или другой файл конфигурации), база данных и * .cs файл. Любая идея для них? –

ответ

1

Сохранение информации, такой как строки подключения и учетные данные в исходном коде, как правило, является плохой практикой. И это не безопаснее, чем хранить его в Web.config (не зашифрованном), потому что все ресурсы можно просто извлечь из кода. Для веб-приложений лучше всего хранить всю вашу конфиденциальную информацию в одном месте (например, web.config), но шифровать ее во время развертывания.

Для шифрования web.config вы можете использовать aspnet_regiis инструмент, который можно найти здесь

%windows%\Microsoft.NET\Framework\versionNumber 

Например

c:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe 

с ключами -pef или -pe. Вы можете шифровать только определенные разделы, такие как <connectionString>, и не зашифровывать другие разделы.

Для получения дополнительной информации см Encrypting and Decrypting Configuration Sections драм How to: Encrypt a web.config File

+0

Может спасибо за ваш хороший ответ. Кажется хорошей идеей сохранить конфиденциальную информацию в web.config. Однако, что, если пользователю необходимо обновить одно из данных базы данных конфигурации i.e или адрес почты smtp? Будет ли возможно обновлять их в зашифрованном файле web.config? С другой стороны, что вы думаете о том, чтобы хранить их в базе данных, кроме как из базы данных, соединяющей строку? –

+1

Обычно это выполняется сервером непрерывной интеграции (CI). Вы просто изменяете свой 'web.config' и фиксируете в репозитории. CI шифрует и развертывает в prod. Однако вы можете сделать это вручную на prod-сервере, расшифровав web.config, изменив его и зашифровав обратно. До CI мы делали это с помощью сценариев powershell. –

+1

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

1

Это вообще хорошая идея для шифрования конфиденциальных данных конфигурации приложения. Есть несколько подходов, доступных вам, в зависимости от того, какое приложение у вас есть.

Для веб-приложений вы можете использовать DPAPI и aspnet_regiis для шифрования конфигурации. См. Encrypt and deploy app.config для примера кода.

В качестве альтернативы (если у вас есть настольное приложение или не хотите aspnet_regiis) вы можете посмотреть на защищенные разделы конфигурации, как описано здесь: https://msdn.microsoft.com/en-us/library/hh8x3tas.aspx

Чтобы ответить на конкретные вопросы:

1) Держите это в web.config и зашифровать его. Hardcoding в файле .cs имеет недостатки с точки зрения безопасности (код может быть декомпилирован), и это затруднит изменение при перемещении вашего кода из среды в окружающую среду (dev -> uat -> prod)

2) Снова , не сохраняйте учетные данные в файле .cs. Вы можете предоставить пользовательский интерфейс для пользователей, чтобы манипулировать конфигурацией, но помните, что они могут нарушить конфигурацию, и вам понадобится механизм для восстановления известной конфигурации.

3) Если вас беспокоит, как часто вы читаете из db (хотя чтение дешево до тех пор, пока нет записей), вы можете просто прочитать всю конфигурацию в классе при запуске. Таким образом, нет временных файлов для управления, и количество чтения на db ограничено.

+0

Большое спасибо за приятные объяснения. У меня есть веб-приложение ASP.NET MVC и нужно уточнить немного больше о следующих моментах: >>> –

+0

** 1) ** Как вы сказали, я буду хранить всю конфигурационную информацию в web.config файл путем шифрования их через ** aspnet_regiis **. Однако, что, если пользователю нужно изменить имя базы данных или адрес smtp почты в файле конфигурации? Будет ли возможно обновлять эту информацию, если они зашифрованы? ** 2) ** Я собираюсь создать страницу для обновления настроек почты smtp. Итак, не могли бы вы привести пример для показа: данные конфигурации извлекаются из базы данных и загружаются в файл класса. Тогда как это можно использовать в классе отправки почты? ** 3) ** Должен ли я шифровать данные конфигурации перед сохранением в базе данных? –

+0

Большое спасибо вам и проголосовали за ваши хорошие объяснения ... –