Безопасные пароли с SqlCredential

Наткнулся на описание новой фичи, которая входит в .Net 4.5, которая должна упростить работу с безопасным хранением паролей к базе данных. Раньше это был, на мой взгляд, какой-то не очень удобный способ с файлами конфигурации, какими-то специальными преобразованиями и чем-то еще. Сейчас же появилась возможность создания безопасных данных о подключении к базе данных, которые не утекут при снятии дампа памяти целенаправленно или случайно в результате аварийной остановки программы, да мало ли какие случаи бывают. Честно сказать, в моей практике доступ к БД в основном осуществлялся с помощью Active Directory, что существенно упрощало работу. Однако такое тоже было не всегда и меня внутренне грыз червячок сомнений о несколько легкомысленном отношении к строкам соединений к БД. Сейчас появился достаточно простой и легкий способ защитить данные о соединении с базой с помощью класса SqlCredential. Теперь стало возможно задать логин\пароль с помощью свойства Credential у класса SqlConnection.

Лучше всего сразу это показать на примере, мне кажется, это будет лучше тысячи слов =)

Поскольку все локально и сервер тестовый, то пароли показывать не страшно. И чтобы два раза не вставать, альтернативный способ задания данных пользователя. Можно сразу передать в строку соединения.

Самым важным моментом при работе с новым классом является то, что он принимает только защищены строки, класс SecureString, при этом экземпляр класса должен быть закрыт к изменениям, т.е. необходимо вызывать метод MakeReadOnly(), в противном случае будет вызвано исключение ArgumentException. Новое свойство Credential несовместимо при указании в явном виде User Id, Password, Context Connection = true, Integrated Security = true. В противном случае будет опять исключение.

Так же установить свойство Credential не выйдет для открытого соединения. Настоятельно рекомендуется оставлять значение по умолчанию (false) для свойства PersistSecurityInfo, чтобы данные о пользователе не возвращались как часть класса соединения, как только соединение с базой будет установлено.

С учетом функциональности нового класса, а так же для повышения безопасности, было изменено поведение пула соединений. Соединения использующие одинаковую строку соединения и одинаковые данные пользователя будут использовать один пул соединений, но малейшие различия и будут созданы разные пулы. Разные экземпляры SqlCredentials будут использовать разные пулы, даже если логин\пароль совпадают. Покажу на примере:

Все 4 соединения будут использовать разные пулы соединений. Причем прошу обратить внимание, что соединения 2 и 3 используют один и тот же логин\пароль, но экземпляры класса SqlCredential разные.

Для использования нового класса с SqlDataAdapter или SqlBulkCopy, требуется сначала создавать соединение с заполненным свойством Credential и потом передавать соединение в конструкторы.

Это все хорошо, но если есть возможность используйте все равно авторизацию средствами Active Directory, это самый простой и надежный способ!

Оставить комментарий