web-dev-qa-db-ja.com

ADO.Net Entity Data Modelの接続文字列にパスワードをインコードで提供する方法

私は、ODataサービスを作成する方法についてこのチュートリアルに従ってきました。

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

そして、それは完璧に動作します...しかし、エンティティデータモデルウィザードで、「データ接続を選択してください」と尋ねると、この警告が表示されます。

「この接続文字列には、データベースへの接続に必要な機密データ(たとえば、パスワード)が含まれているようです。機密データを接続文字列に保存すると、セキュリティリスクになる可能性があります。この機密データを接続文字列に含めますか? ?」

「いいえ、接続文字列から機密データを除外します。アプリケーションコードで設定します。」

「アプリケーションコードに」パスワードを挿入できる場所がわかりません。 (私の会社はそれらを暗号化してレジストリに保存しています)

さらに、環境(Dev、CA、またはProd)に応じて接続する必要のある複数のDBがあり、正しいパスワードを取得するために接続文字列でどのDBが参照されているかを知る必要があります。

ありがとう。

23
saunderl

コンテキストを作成するときに、接続文字列を設定できます。この接続文字列を作成するには、ブラウザに応じて、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
}
32
Francis

「ダミー」パスワードを構成ファイル(「XXXXX」)に追加し、エンティティコンストラクターでその値を実際のパスワードに置き換えました

public MyDatabaseContainer() : base("name=MyDatabaseContainer")
{
    Database.Connection.ConnectionString = Database.Connection.ConnectionString.Replace("XXXXX","realpwd");
}
17
TheTall

エンティティのコンストラクターを変更する

 public sampleDBEntities() : base("name=sampleDBEntities")
    {
        this.Database.Connection.ConnectionString = @"Data Source=.\;Initial Catalog=sampleDB;Persist Security Info=True;User ID=sa;Password=Password123"; ;
    }
11
Vignesh Raja

私のサンプルアプリケーションは「データベースファースト」モードで記述されており、以下の「CreateNewConnectionString」メソッドは問題なく機能します(ただし、見た目はそれほどエレガントではありません)。

「CreateNewConnectionString2」メソッドは非常にエレガントに見えますが、「コードファースト」モードでのみ有効であることを伝える例外が発生します。

したがって、私は自分のメソッドを使用するように変更したコンストラクターとともに、両方のメソッドを提供しています。注および注意:テンプレートによって生成されたコードを変更しました。コードが再生成されると、上書きされる可能性があります。私にはそれを置くのに適切な場所のように思えます。

アプリケーションが「コードファースト」モードで生成された場合、「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")
    {
    }
3
Jim Kay