2016-03-17 57 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