2011-11-17 7 views
16

He estado siguiendo este tutorial sobre cómo crear un servicio OData.Cómo introducir la contraseña en una cadena de conexión en un modelo de datos de entidad ADO.Net

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

y funciona sin problemas ... pero, en el Asistente para Entity Data Model, cuando se le pide que "Elige tu conexión de datos" que le da esta advertencia.

"Esta cadena de conexión parece contener datos confidenciales (por ejemplo, una contraseña) necesarios para conectarse a la base de datos. Almacenar datos confidenciales en la cadena de conexión puede ser un riesgo de seguridad. ¿Desea incluir esta información confidencial? en la cadena de conexión? "

Si elijo: "No, excluya datos confidenciales de la cadena de conexión. Lo estableceré en el código de mi aplicación".

No veo dónde puedo, "en mi código de aplicación" inserte la contraseña. (Mi empresa los almacena encriptados en el registro)

Además, tengo múltiples bases de datos a las que necesito conectar, dependiendo del entorno (Dev, CA o Prod) y necesito saber a qué DB se hace referencia en el cadena de conexión para obtener la contraseña correcta.

Gracias.

+0

Cómo * en el código .. *, una buena redacción de la pregunta:) – Irfan

Respuesta

27

Cuando crea su contexto, puede establecer una cadena de conexión. Para construir esta cadena de conexión, puede analizar la cadena de conexión sin la contraseña con un EntityConnectionStringBuilder y luego analizar la cadena de conexión interna con otra ConnectionStringBuilder, dependiendo de su navegador. Luego puede establecer la contraseña y pasarla al constructor.

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 
} 
+2

¡Gracias! La única pieza que no hizo este "Plug-and-play" fue dónde poner este código.Finalmente me di cuenta de que necesitaba anular el DataService CreateDataSource() – saunderl

+2

Al anular el DataService CreateDataSource(), ¿sería público o privado? –

9

Modifique el constructor de las entidades

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

Mi aplicación de la muestra fue escrito en "primera base de datos" el modo y el método "CreateNewConnectionString" a continuación funciona bien (aunque no se ve todo lo que elegante.)

El método "CreateNewConnectionString2" se ve realmente elegante, PERO causa una excepción diciéndome que solo es válido en el modo "Code First".

Proporciono ambos métodos junto con el constructor que modifiqué para usar mis métodos. NOTA Y CUIDADO, modifiqué el código generado por una plantilla y está sujeto a sobreescribirlo si se regenera. Para mí, parece el lugar adecuado para expresarlo.

Si la aplicación se genera en modo "Código primero", puede que tenga que utilizar "CreateNewConnectionString2" (que aún no he probado esta opción.)

me apresuro a reconocer que he copiado los dos bloques de código de otra publicaciones ya que aún no sé lo suficiente sobre todo esto para escribir mi propio código.

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") 
    { 
    } 
7

que añade una contraseña "ficticia" en el archivo de configuración ("XXXXX"), luego se reemplaza ese valor con la contraseña real en el constructor entidad

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