Comment fournir le mot de passe à une chaîne de connexion dans un ADO.Net modèle de données de L'entité

j'ai suivi ce tutoriel sur la façon de créer un service OData.

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

et ça marche parfaitement ... mais, dans L'Assistant Entity Data Model, quand il vous demande de "choisir votre connexion de données", il vous donne cet avertissement.

"cette chaîne de connexion semble contenir des données sensibles (par exemple, un mot de passe) qui sont nécessaires pour se connecter à la base de données. Le stockage de données sensibles dans la chaîne de connexion peut constituer un risque pour la sécurité. Voulez-vous d'inclure des données sensibles dans la chaîne de connexion?"

Si je choisis: "Non, exclure les données sensibles de la chaîne de connexion. Je vais le mettre dans mon code d'application."

je ne vois pas où je peux, dans mon code d'application", insérer le mot de passe. (Mon entreprise stocke crypté dans la base de registre)

de plus, j'ai plusieurs DBs dont j'ai besoin connectez-vous à, selon L'environnement (Dev, CA, ou Prod) et j'ai besoin de savoir quel DB est référencé dans la chaîne de connexion pour obtenir le mot de passe correct.

Merci.

19
demandé sur saunderl 2011-11-17 19:51:14

4 réponses

Lorsque vous créez votre contexte, vous pouvez définir une chaîne de connexion. Pour construire cette chaîne de connexion, vous pouvez analyser la chaîne de connexion sans mot de passe avec un EntityConnectionStringBuilder et puis analyser la chaîne de connexion interne avec un autre ConnectionStringBuilder, selon votre navigateur. Ensuite, vous pouvez définir le mot de passe et passer au constructeur.

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
}
29
répondu Francis 2015-10-05 06:34:01

j'ai ajouté un mot de passe" factice " dans le fichier de configuration ("XXXXX"), puis remplacé cette valeur par le vrai mot de passe dans le constructeur d'entity

public MyDatabaseContainer() : base("name=MyDatabaseContainer")
{
    Database.Connection.ConnectionString = Database.Connection.ConnectionString.Replace("XXXXX","realpwd");
}
9
répondu TheTall 2015-09-28 21:26:23

modifier le constructeur des entities

 public sampleDBEntities() : base("name=sampleDBEntities")
    {
        this.Database.Connection.ConnectionString = @"Data Source=.\;Initial Catalog=sampleDB;Persist Security Info=True;User ID=sa;Password=Password123"; ;
    }
8
répondu Vignesh Raja 2013-12-11 08:21:55

mon application sample a été écrite en mode "Database First" et la méthode "CreateNewConnectionString" ci-dessous fonctionne très bien (bien qu'elle n'ait pas l'air si élégante que ça.)

la méthode" CreateNewConnectionString2 "a l'air vraiment élégante, mais provoque une exception me disant qu'elle n'est valide qu'en mode" Code D'abord".

donc je fournis les deux méthodes avec le constructeur que j'ai modifié pour utiliser mes méthodes. NOTE et attention, j'ai modifié le code généré par un modèle et qui est sujet à être écrasé si le code est régénéré. Pour moi, c'est le bon endroit pour le mettre.

si votre application a été générée en mode" Code First", vous devrez peut-être utiliser" CreateNewConnectionString2 " (Je n'ai pas encore testé cette option.)

Je m'empresse d'admettre que j'ai copié les deux blocs de code à partir d'autres messages car je ne sais pas encore presque assez sur tout cela pour écrire mon propre code.

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
répondu Jim Kay 2015-06-20 12:24:15