Как в коде предоставить пароль для строки подключения в модели данных объекта ADO.Net - PullRequest
21 голосов
/ 17 ноября 2011

Я следовал этому руководству по созданию службы OData.

http://www.hanselman.com/blog/CreatingAnODataAPIForStackOverflowIncludingXMLAndJSONIn30Minutes.aspx

И это работает безупречно ... но в мастере Entity Data Model Wizard, когда он просит вас «выбрать подключение к данным», он выдает вам это предупреждение.

"Эта строка подключения содержит конфиденциальные данные (например, пароль), необходимые для подключения к базе данных. Хранение конфиденциальных данных в строке подключения может представлять угрозу безопасности. Вы хотите включить эти конфиденциальные данные в строка подключения? "

Если я выберу: «Нет, исключите конфиденциальные данные из строки подключения. Я установлю их в своем коде приложения».

Я не вижу, где я могу "в коде моего приложения" вставить пароль. (Моя компания хранит их в зашифрованном виде в реестре)

Кроме того, у меня есть несколько БД, к которым мне нужно подключиться, в зависимости от среды (Dev, CA или Prod), и мне нужно знать, на какую БД ссылаются в строке подключения, чтобы получить правильный пароль.

Спасибо.

Ответы [ 4 ]

31 голосов
/ 17 ноября 2011

Когда вы создаете свой контекст, вы можете установить строку подключения.Чтобы создать эту строку подключения, вы можете проанализировать строку подключения без пароля с EntityConnectionStringBuilder, а затем проанализировать внутреннюю строку подключения с другой ConnectionStringBuilder, в зависимости от вашего браузера.Затем вы можете установить пароль и передать его конструктору.

var originalConnectionString = ConfigurationManager.ConnectionStrings["your_connection_string"].ConnectionString;
var entityBuilder = new EntityConnectionStringBuilder(originalConnectionString);
var factory = DbProviderFactories.GetFactory(entityBuilder.Provider);
var providerBuilder = factory.CreateConnectionStringBuilder();

providerBuilder.ConnectionString = entityBuilder.ProviderConnectionString;

providerBuilder.Add("Password", "Password123");

entityBuilder.ProviderConnectionString = providerBuilder.ToString();

using (var context = new YourContext(entityBuilder.ToString()))
{
    // TODO
}
15 голосов
/ 29 сентября 2015

Я добавил «фиктивный» пароль в файл конфигурации («XXXXX»), а затем заменил это значение реальным паролем в конструкторе сущностей

public MyDatabaseContainer() : base("name=MyDatabaseContainer")
{
    Database.Connection.ConnectionString = Database.Connection.ConnectionString.Replace("XXXXX","realpwd");
}
11 голосов
/ 11 декабря 2013

Изменить конструктор сущностей

 public sampleDBEntities() : base("name=sampleDBEntities")
    {
        this.Database.Connection.ConnectionString = @"Data Source=.\;Initial Catalog=sampleDB;Persist Security Info=True;User ID=sa;Password=Password123"; ;
    }
3 голосов
/ 24 февраля 2015

Мой пример приложения был написан в режиме «Сначала база данных», а метод «CreateNewConnectionString», представленный ниже, работает просто отлично (хотя выглядит не так уж и элегантно).

Метод «CreateNewConnectionString2» выглядит действительно элегантно, НО вызывает исключение, говорящее мне, что он действителен только в режиме «Code First».

Итак, я предоставляю оба метода вместе с конструктором, который я изменил, чтобы использовать мои методы.ВНИМАНИЕ И ВНИМАНИЕ! Я изменил код, сгенерированный шаблоном, и он может быть перезаписан при повторном создании кода.Мне кажется, что это правильное место.

Если ваше приложение было сгенерировано в режиме «Code First», вам может понадобиться использовать «CreateNewConnectionString2» (я еще не тестировал эту опцию.)

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

private static string CreateNewConnectionString(string connectionName, string password)
        {
        var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~").ConnectionStrings.ConnectionStrings[connectionName];
       //or:
       //var config = ConfigurationManager.ConnectionStrings[connectionName];
        var split = config.ConnectionString.Split(Convert.ToChar(";"));
        var sb = new System.Text.StringBuilder();

        for (var i = 0; i <= (split.Length - 1); i++)
        {
            if (split[i].ToLower().Contains("user id"))
            {
                split[i] += ";Password=" + password;
            }

            if (i < (split.Length - 1))
            {
                sb.AppendFormat("{0};", split[i]);
            }
            else
            {
                sb.Append(split[i]);
            }
        }
        return sb.ToString();
    }

    private static string CreateNewConnectionString2(string connectionName, string password)
    {
        var originalConnectionString = ConfigurationManager.ConnectionStrings[connectionName].ConnectionString;
        var entityBuilder = new EntityConnectionStringBuilder(originalConnectionString);
        var factory = DbProviderFactories.GetFactory(entityBuilder.Provider);
        var providerBuilder = factory.CreateConnectionStringBuilder();

        providerBuilder.ConnectionString = entityBuilder.ProviderConnectionString;

        providerBuilder.Add("Password", password);

        entityBuilder.ProviderConnectionString = providerBuilder.ToString();
        return entityBuilder.ProviderConnectionString;
    }

    public ChineseStudyEntities()
        : base(CreateNewConnectionString("ChineseStudyEntities", "put YOUR password here")) // base("name=ChineseStudyEntities")
    {
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...