私は、ODataサービスを作成する方法についてこのチュートリアルに従ってきました。
http://www.hanselman.com/blog/CreatingAnODataAPIForStackOverflowInlusionXMLAndJSONIn30Minutes.aspx
そして、それは完璧に動作します...しかし、エンティティデータモデルウィザードで、「データ接続を選択してください」と尋ねると、この警告が表示されます。
「この接続文字列には、データベースへの接続に必要な機密データ(たとえば、パスワード)が含まれているようです。機密データを接続文字列に保存すると、セキュリティリスクになる可能性があります。この機密データを接続文字列に含めますか? ?」
「いいえ、接続文字列から機密データを除外します。アプリケーションコードで設定します。」
「アプリケーションコードに」パスワードを挿入できる場所がわかりません。 (私の会社はそれらを暗号化してレジストリに保存しています)
さらに、環境(Dev、CA、またはProd)に応じて接続する必要のある複数のDBがあり、正しいパスワードを取得するために接続文字列でどのDBが参照されているかを知る必要があります。
ありがとう。
コンテキストを作成するときに、接続文字列を設定できます。この接続文字列を作成するには、ブラウザに応じて、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
}
「ダミー」パスワードを構成ファイル(「XXXXX」)に追加し、エンティティコンストラクターでその値を実際のパスワードに置き換えました
public MyDatabaseContainer() : base("name=MyDatabaseContainer")
{
Database.Connection.ConnectionString = Database.Connection.ConnectionString.Replace("XXXXX","realpwd");
}
エンティティのコンストラクターを変更する
public sampleDBEntities() : base("name=sampleDBEntities")
{
this.Database.Connection.ConnectionString = @"Data Source=.\;Initial Catalog=sampleDB;Persist Security Info=True;User ID=sa;Password=Password123"; ;
}
私のサンプルアプリケーションは「データベースファースト」モードで記述されており、以下の「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")
{
}