如何在ADO.Net实体数据模型中为密码连接提供密码

时间:2011-11-17 15:51:14

标签: c# entity-framework-4 ado.net odata

我一直在关注如何创建OData服务的本教程。

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

它完美无瑕地工作......但是,在实体数据模型向导中,当它要求您“选择您的数据连接”时,它会向您发出此警告。

“此连接字符串似乎包含连接到数据库所需的敏感数据(例如,密码)。在连接字符串中存储敏感数据可能存在安全风险。是否要包含此敏感数据?连接字符串?“

如果我选择:“不,请从连接字符串中排除敏感数据。我将在我的应用程序代码中设置它。”

我看不到我能在哪里,“在我的应用程序代码中”插入密码。 (我的公司将它们加密存储在注册表中)

另外,我需要连接多个DB,具体取决于环境(Dev,CA或Prod),我需要知道连接字符串中引用了什么数据库才能获得正确的密码。

感谢。

4 个答案:

答案 0 :(得分:31)

创建上下文时,可以设置连接字符串。要构建此连接字符串,您可以使用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
}

答案 1 :(得分:15)

我在配置文件(“XXXXX”)中添加了一个“虚拟”密码,然后用实体构造函数中的真实密码替换了该值

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

答案 2 :(得分:11)

修改实体的构造函数

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

答案 3 :(得分:3)

我的示例应用程序是用#34; Database First"模式和" 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")
    {
    }