2012-09-17 10 views
26

estoy usando ADO.NET para obtener información de la base de datos en un servidor,
por lo que este es lo que hago:ConnectionString pierde contraseña después de connection.Open

string conStr = "Data Source=myServer\SQLEXPRESS;Initial Catalog=DBName;User ID=myUser;Password=myPassword"; 

SqlConnection conn = new SqlConnection(conStr); 

conn.Open(); 
// do stuff 
conn.Close(); 

pero después de llamar abierto método me di cuenta de que conn.ConnectionString es la pérdida de la contraseña por lo que se convierte en:

"Data Source=myServer\SQLEXPRESS;Initial Catalog=DBName;User ID=myUser;" 

lo que provoca una excepción con cualquier SqlCommand epílogos
cómo solucionarlo?
Nota: Lo extraño es que no sucede siempre
Editar: No creo que tenga nada que ver con el comando que sí, pero de todos modos

SqlCommand command = new SqlCommand("select GetDate()", conn); 
SqlDataReader reader = command.ExecuteReader(); 
+0

Bueno, para empezar, ¿tiene código real después de ejecutar conn.Open()? De lo contrario, lo está abriendo y luego cerrándolo en función de lo que tiene en su ejemplo anterior .. – MethodMan

+0

ConStr no puede ser modificado por SqlConnection en el código publicado ¿Estás tratando de mirar conn.ConnectionString (¿o alguna propiedad similar?). –

+0

@insta: Tha es lo que OP dijo: _ "noté que conn.ConnectionString está perdiendo la contraseña" _ –

Respuesta

42

Esto es por diseño, por razones de seguridad. De MSDN:

ConnectionString es similar a una cadena de conexión OLE DB, pero no es idéntica. A diferencia de OLE DB o ADO, la cadena de conexión que se devuelve es la misma que ConnectionString configurada por el usuario, menos la información de seguridad si el valor de Persist Security Info se establece en false (valor predeterminado). El Proveedor de datos de .NET Framework para SQL Server no persiste ni devuelve la contraseña en una cadena de conexión a menos que establezca Persist Security Info en verdadero.

+0

bueno, lo leí en alguna parte y no sabía cómo usarlo, ¿puede decirme cómo usarlo, por favor? porque no veo ** Persistir información de seguridad ** en cualquier lugar, gracias – Star

+4

@Star, hay un ejemplo en el enlace que te di. Solo incluya "Persistir seguridad Info = True" en la cadena de conexión. Pero de todos modos, no debería necesitar hacer eso ... si necesita que la propiedad ConnectionString retenga la contraseña, probablemente no la esté usando correctamente. –

+0

ya veo, ¿tienes alguna idea de dónde podría haber perdido? y de nuevo realmente gracias :) – Star

30

Buscar en la cadena de conexión, con el fin de mantener la contraseña en la propiedad ConnectionString debe agregar "Persist Security Info=true;" a la cadena de conexión en sí.

En el siguiente ejemplo se tira de la contraseña a cabo:

string conStr = "Data Source=localhost;Initial Catalog=MyDatabase;User Id=MyUser;Password=MyPassword"; 
SqlConnection conn = new SqlConnection(conStr); 
conn.Open(); 
conn.Close(); 
Console.WriteLine(conn.ConnectionString); 

el siguiente ejemplo se mantendrá la contraseña en el conn.ConnectionString:

string conStr = "Persist Security Info=True;Data Source=localhost;Initial Catalog=MyDatabase;User Id=MyUser;Password=MyPassword"; 
SqlConnection conn = new SqlConnection(conStr); 
conn.Open(); 
conn.Close(); 
Console.WriteLine(conn.ConnectionString); 

Es un conjunto de propiedades dentro de la cadena de conexión en sí no en el SqlConnection objeto, lo puse al comienzo de la cadena de conexión para que no tenga que desplazarse para verlo, puede ir a cualquier parte de la cadena de conexión, generalmente lo veo al final.

Al igual que otros han dicho, si necesita hacer esto, posiblemente no esté utilizando el objeto SqlConnection exactamente como estaba previsto.

4

Es posible que desee agregar su propia validación, pero esto tomará una SqlConnection estándar (sin persistir la seguridad) y accederá a la propiedad privada ConnectionOptions para recuperar la cadena de conexión.

public static string SqlConnectionToConnectionString(SqlConnection conn) 
{ 
    System.Reflection.PropertyInfo property = conn.GetType().GetProperty("ConnectionOptions", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); 
    object optionsObject = property.GetValue(conn, null); 
    System.Reflection.MethodInfo method = optionsObject.GetType().GetMethod("UsersConnectionString"); 
    string connStr = method.Invoke(optionsObject, new object[] { false }) as string; // argument is "hidePassword" so we set it to false 
    return connStr; 
} 

Tenga en cuenta que esto podría fallar si MS cambia la implementación subyacente, ya que estamos utilizando la reflexión. No estoy aconsejando esto como la mejor manera de hacerlo, pero es una manera.

Cuestiones relacionadas