2016-03-17 24 views
0

所以我有一个登录页面,我必须实现验证:'如果用户是“sa”,那么它应该使用该用户凭据连接到数据库',这意味着我必须修改得到一个例外更改SqlConnection,凭据属性

 if(username.Equals("sa", StringComparison.OrdinalIgnoreCase)) 
     { 
      var securePassword = new System.Security.SecureString(); 
      foreach(char character in password) 
      { 
       securePassword.AppendChar(character); 
      } 

      securePassword.MakeReadOnly(); 
      var credentials = new SqlCredential(username, securePassword); 
      sqlConn.Close(); 
      sqlConn.Credential = credentials; 

      sqlConn.Open(); 

      return true; 
     } 

但是我在sqlConn.Credential = credentials;即使属性不是readonly

出现InvalidOperationException:我SqlConnection对象的证书不能与用户名使用的凭据,UID,密码,或PWD连接字符串关键字。

有没有其他方法可以改变Credentials属性?

在此先感谢。

+0

你检查了这一点:http://stackoverflow.com/questions/1642483/when- using-trusted-connection-true-and-sql-server-authentication-will-this-effe – Octanic

+0

我的'connectionString'中没有'integrated security'。看起来你可以修改凭据,如果'SqlConnection'有一个用户和密码,我使用了一个解决方法来解决它。 – DCruz22

回答

1

好像你可以修改凭证,如果SqlConnection有一个用户和密码。我用this教程的例子,使其工作:

 if (username.Equals("sa", StringComparison.OrdinalIgnoreCase)) 
     { 
      using (SqlConnection conn = new SqlConnection(string.Format("Server={0};Initial Catalog={1};", sqlConn.DataSource, sqlConn.Database))) 
      { 
       var securePassword = new System.Security.SecureString(); 
       foreach (char character in password) 
       { 
        securePassword.AppendChar(character); 
       } 

       securePassword.MakeReadOnly(); 

       var credentials = new SqlCredential(username, securePassword); 
       conn.Credential = credentials; 

       conn.Open(); 

       return true; 
      } 
     } 

因为我无法修改Credential财产我做了我SqlConnection对象的副本,而不在connectionStringusernamepassword。这样我可以稍后添加新的Credential。希望这可以帮助任何面临类似问题的人。

1

SqlConnection.Credential物业

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.credential(v=vs.110).aspx

一个InvalidOperationException将引发异常:

  • 如果证书是一个敞开的连接上。
  • 如果在Context Connection = true时设置了Credential,
  • 如果集成安全性= true时设置了凭证。
  • 如果在连接字符串使用Password时设置了Credential。
  • 如果在连接字符串使用UserID时设置了Credential。
+0

是的,对我而言,这是因为最后两个选项。我张贴我解决它的方式,但感谢信息。 – DCruz22

1

或者你可以使用SqlConnectionStringBuilder

string connectString = "Data source=.;initial catalog=yourDB; 
         User Id=user; Password=password"; 
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder (connectString); 
SqlConnection sqlConn= new SqlConnection(builder.ConnectionString); 
在你的方法

然后,

builder.Remove("User Id"); 
builder.Remove("Password"); 
// builder.Remove("integrated security"); if you had used 
sqlConn.ConnectionString = builder.ConnectionString; 
+0

这是一个很好的方式来做到这一点。谢谢! – DCruz22