without framework custom c# entity-framework-4 ado.net odata

c# - framework - odata web api filter



Cómo ingresar el código de la contraseña a una cadena de conexión en un modelo de datos de entidad ADO.Net (4)

He estado siguiendo este tutorial sobre cómo crear un servicio OData.

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

Y funciona a la perfección ... pero, en el Asistente para el modelo de datos de la entidad, cuando te pide que "elijas tu conexión de datos" te da esta advertencia.

"Esta cadena de conexión parece contener datos confidenciales (por ejemplo, una contraseña) que se requieren para conectarse a la base de datos. El almacenamiento de datos confidenciales en la cadena de conexión puede ser un riesgo para la seguridad. ¿Desea incluir estos datos confidenciales en la cadena de conexión? ? "

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

No veo dónde puedo, "en mi código de solicitud" inserte la contraseña. (Mi empresa las almacena encriptadas en el registro)

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

Gracias.


Agregué una contraseña "ficticia" en el archivo de configuración ("XXXXX"), luego reemplacé ese valor con la contraseña real en el constructor de la entidad

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


Mi aplicación de muestra se escribió en el modo "Primero la base de datos" y el método "Crear nueva conexión de cadena" que se muestra a continuación funciona bien (aunque no parece tan elegante).

El método "CreateNewConnectionString2" parece realmente elegante, PERO causa una excepción que me dice que solo es válido en el modo "Código Primero".

Así que estoy proporcionando ambos métodos junto con el constructor que modifiqué para usar mis métodos. NOTA Y CUIDADO, he modificado el código generado por una plantilla y está sujeto a que se sobrescriba si el código se regenera. A mi me parece el lugar adecuado para ponerlo.

Si su aplicación se generó en el modo "Código Primero", es posible que deba usar "CreateNewConnectionString2" (aún no he probado esta opción).

Me apresuro a admitir que copié ambos bloques de código de otras publicaciones, ya que todavía 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") { }


Modificar 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"; ; }


Cuando creas tu contexto, puedes establecer una cadena de conexión. Para crear 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 otro ConnectionStringBuilder , dependiendo de su navegador. Luego puedes 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 }