web-dev-qa-db-fra.com

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

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

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

Et cela fonctionne parfaitement ... mais, dans l'assistant de modèle de données d'entité, lorsqu'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 inclure ces données sensibles dans la chaîne de connexion ? "

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

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

De plus, j'ai plusieurs bases de données auxquelles je dois me connecter, en fonction de l'environnement (Dev, CA ou Prod) et j'ai besoin de savoir à quelle base de données est référencé dans la chaîne de connexion pour obtenir le mot de passe correct.

Merci.

23
saunderl

Lorsque vous créez votre contexte, vous pouvez définir une chaîne de connexion. Pour créer cette chaîne de connexion, vous pouvez analyser la chaîne de connexion sans le mot de passe avec un EntityConnectionStringBuilder, 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 le transmettre 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
}
32
Francis

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

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

Modifier le constructeur des entités

 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

Mon exemple d'application a été écrit en mode "Database First" et la méthode "CreateNewConnectionString" ci-dessous fonctionne très bien (même si elle n'a pas l'air si élégante.)

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 First".

Je fournis donc les deux méthodes avec le constructeur que j'ai modifié pour utiliser mes méthodes. REMARQUE ET ATTENTION, j'ai modifié le code généré par un modèle et qui est susceptible d'être écrasé si le code est régénéré. Pour moi, cela semble être le bon endroit pour le dire.

Si votre application a été générée en mode "Code en premier", 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 publications, car je n'en sais pas encore 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
Jim Kay