天天看點

SQL Server 連接配接字元串和身份驗證詳解

SQL Server .NET Data Provider 連接配接字元串包含一個由一些屬性名/值對組成的集合。每一個屬性/值對都由分号隔開。

          PropertyName1=Value1;PropertyName2=Value2;PropertyName3=Value3;.....

同樣,連接配接字元串必須包含SQL Server執行個體名稱:

          Data Source=ServerName;

          使用本地的SQL Server(localhost),如果想要使用遠端伺服器運作,應該在示例對象中把正确的伺服器賦給Data Source 屬性。此外,還必須指定所支援的兩種身份驗證方法(即Windows身份驗證和SQL Server身份驗證)中的其中一種。Windows身份驗證使用Windows登入使用者身份連接配接資料庫,而SQL身份驗證要求顯式地指定SQL Server使用者ID和密碼。要想使用Windows身份驗證,必須在連接配接字元串中包括 Integrated Security 屬性:

          Data Source=ServerName;Integrated Security=True;

          預設情況下,Integrated Security 屬性為 False ,這意味着将禁用Windows身份驗證。如果沒有顯式地把這個屬性的值設定為True,連接配接将使用SQL Server身份驗證,是以,必須提供SQL Server使用者ID和密碼。Integrated Security屬性還能識别的其他值隻有SSPI(Security Support Provider Interface,安全性支援提供者接口).在所有的Windows NT作業系統上,其中包括Windows NT 4.0、2000、XP,都支援值SSPI。它是使用Windows身份驗證時可以使用的惟一接口,相當于把Integrated Security 屬性值設定為True。

          在Windows身份驗證模式中,SQL Server使用Windows的本機安全性授權對使用者連接配接進行有效性驗證。即使顯示地指定使用者ID和密碼,SQL Server也不檢查連接配接字元串中的使用者ID和密碼。因為隻有Windows NT、2000、XP支援SSPI,是以如果正使用的是這些作業系統,則隻能使用Windows內建的安全政策去連接配接SQL Server。不論使用哪一個作業系統,當使用SQL Server身份驗證時,必須在連接配接字元串中指定使用者ID和密碼:

Data Source=ServerName;User ID=donaldx;Password=unbreakable

          預設情況下,SQL Server .NET Data Provider連接配接指定使用者的預設資料庫,當在資料庫中建立使用者時,可以設定使用者的預設資料庫。此外,也可以在任意時間更改使用者的預設資料庫。例如,系統管理者的預設資料庫是master。如果想要連接配接不同的資料庫,應該指定資料庫的名稱:

Data Source=ServerName;Integrated Security=SSPI;Initial Catalog=Northwind

          每一種身份驗證都有它的優點和缺點。Windows身份驗證使用單一的使用者資訊庫源,是以,不需要為資料庫通路去分别配置使用者。連接配接字元串不包含使用者ID和密碼,是以消除了把使用者ID和密碼暴露給未授權的使用者的危險。可以在Active Directory中管理使用者和他們的角色,而不必在SQL Server中顯式地配置他們的屬性。

Windows身份驗證的缺點是,它要求客戶通過Windows的本機安全性授權支援的安全通道去連接配接SQL Server。如果應用種序需要通過不安全的網絡(例如Internet)連接配接SQL Server,Windows身份驗證将不工作。此外,這種身份驗證方法也部分地把管理資料庫通路控制的責任從DBA身上轉移到了系統管理者身上,這在确定的環境中也許是一個問題。

          一般而言,在設計通用的應用程式時,為了使用Windows身份驗證,将會對一些方面進行加強。大多數公司的資料庫都駐留在比較健壯的Windows伺服器作業系統上,那些作業系統都支援Windows身份驗證。資料通路層和資料表示層的分離也促進了把資料通路代碼封裝在中間層元件思想的應用,中間層元件通常運作在具有資料庫伺服器的内部網絡中。當這樣設計時,就不需要通過不安全通道建立資料庫連接配接。除此之外,Web服務也使直接連接配接不同域中資料庫的需要大減少。

資料庫的連接配接性已經發展成為應用程式開發的一個标準方面。資料庫連接配接字元串現在已經成為每個項目的标準必備條件。我發現自己為了找到所需要的句法,經常要從另外一個應用程式中複制連接配接字元串或者進行一次搜尋。這個在與SQL Server互動操作時更是如此,因為它有太多的連接配接字元串選項。現在就讓我們來研究一下連接配接字元串的衆多方面。

連接配接字元串

在對象執行個體化或者建立期間,資料庫連接配接字元串通過屬性或方法被傳遞到必要的對象。連接配接字元串的格式是一個以分号為界,劃分鍵/值參數對的清單。清單A中包括了一個C#中的例子,說明了怎樣用建立SqlConnection對象的方法連接配接到SQL Server(實際的連接配接字元串是通過對象的ConnectionString屬性配置設定的)。清單B中包括的是VB.NET的版本。

清單A

string cString = "Data Source=server;Initial Catalog=db;User ID=test;Password=test;";

SqlConnectionconn = new SqlConnection();

conn.ConnectionString = cString;

conn.Open();

清單B

Dim cString As String

cString = "Data Source=server;Initial Catalog=db;User ID=test;Password=test;"

Dim conn As SqlConnection = New SqlConnection()

conn.ConnectionString = cString

conn.Open()

連接配接字元串會指定資料庫伺服器和資料庫,以及通路資料庫必需的使用者名和密碼。但是這種格式并不是對所有資料庫互動都适用,它的确有許多可用的選項,其中很多選項都有同義詞。

和Data Source(資料源)、Initial Catalog(初始編目)、User ID(使用者ID)、和Password(密碼)等元素一起,下面這些選項都是可用的: 

  • Application Name(應用程式名稱):應用程式的名稱。如果沒有被指定的話,它的值為.NET SqlClient Data Provider(資料提供程式).
  • AttachDBFilename/extended properties(擴充屬性)/Initial File Name(初始檔案名):可連接配接資料庫的主要檔案的名稱,包括完整路徑名稱。資料庫名稱必須用關鍵字資料庫指定。
  • Connect Timeout(連接配接逾時)/Connection Timeout(連接配接逾時):一個到伺服器的連接配接在終止之前等待的時間長度(以秒計),預設值為15。
  • Connection Lifetime(連接配接生存時間):當一個連接配接被傳回到連接配接池時,它的建立時間會與目前時間進行對比。如果這個時間跨度超過了連接配接的有效期的話,連接配接就被取消。其預設值為0。
  • Connection Reset(連接配接重置):表示一個連接配接在從連接配接池中被移除時是否被重置。一個僞的有效在獲得一個連接配接的時候就無需再進行一個額外的伺服器來回運作,其預設值為真。
  • Current Language(目前語言):SQL Server語言記錄的名稱。
  • Data Source(資料源)/Server(伺服器)/Address(位址)/Addr(位址)/Network Address(網絡位址):SQL Server執行個體的名稱或網絡位址。
  • Encrypt(加密):當值為真時,如果伺服器安裝了授權證書,SQL Server就會對所有在客戶和伺服器之間傳輸的資料使用SSL加密。被接受的值有true(真)、false(僞)、yes(是)和no(否)。
  • Enlist(登記):表示連接配接池程式是否會自動登記建立線程的目前事務語境中的連接配接,其預設值為真。
  • Database(資料庫)/Initial Catalog(初始編目):資料庫的名稱。
  • Integrated Security(內建安全)/Trusted Connection(受信連接配接):表示Windows認證是否被用來連接配接資料庫。它可以被設定成真、僞或者是和真對等的sspi,其預設值為僞。
  • Max Pool Size(連接配接池的最大容量):連接配接池允許的連接配接數的最大值,其預設值為100。
  • Min Pool Size(連接配接池的最小容量):連接配接池允許的連接配接數的最小值,其預設值為0。
  • Network Library(網絡庫)/Net(網絡):用來建立到一個SQL Server執行個體的連接配接的網絡庫。支援的值包括: dbnmpntw (Named Pipes)、dbmsrpcn (Multiprotocol/RPC)、dbmsvinn(Banyan Vines)、dbmsspxn (IPX/SPX)和dbmssocn (TCP/IP)。協定的動态連結庫必須被安裝到适當的連接配接,其預設值為TCP/IP。
  • Packet Size(資料包大小):用來和資料庫通信的網絡資料包的大小。其預設值為8192。
  • Password(密碼)/Pwd:與帳戶名相對應的密碼。
  • Persist Security Info(保持安全資訊):用來确定一旦連接配接建立了以後安全資訊是否可用。如果值為真的話,說明像使用者名和密碼這樣對安全性比較敏感的資料可用,而如果值為僞則不可用。重置連接配接字元串将重新配置包括密碼在内的所有連接配接字元串的值。其預設值為僞。
  • Pooling(池):确定是否使用連接配接池。如果值為真的話,連接配接就要從适當的連接配接池中獲得,或者,如果需要的話,連接配接将被建立,然後被加入合适的連接配接池中。其預設值為真。
  • User ID(使用者ID):用來登陸資料庫的帳戶名。
  • Workstation ID(工作站ID):連接配接到SQL Server的工作站的名稱。其預設值為本地計算機的名稱。

解決SQL Server 連接配接時的一些基本問題後總結

總結如下:

1、SQL Server的連接配接方式

以本地伺服器(LocalHost),資料庫(Northwind)為例,可以有以下一些連接配接方式

SqlConnection conn=new SqlConnection( "Server=LocalHost;Integrated Security=SSPI;Database=Northwind");

SqlConnection conn = new SqlConnection("Data Source=LocalHost;Integrated Security=SSPI;Initial Catalog=Northwind;");

SqlConnection conn = new SqlConnection(" Data Source=LocalHost;Initial Catalog=Northwind;Integrated Security=SSPI;Persist Security Info=False;Workstation Id=XURUI;Packet Size=4096; ");

SqlConnection myConn = new SqlConnection("Persist Security Info=False;Integrated Security=SSPI;Database=northwind;Server=LocalHost");

SqlConnection conn = new SqlConnection(" Uid=sa;Pwd=***;Initial Catalog=Northwind;Data Source=LocalHost;Connect Timeout=900");

小結

a.Server和Database,Data Source和Initial Catalog配對使用的,可以互相替換

b.Integrated Security預設值是False,此時需要提供Uid和Pwd,即将以Sql Server 使用者身份登陸資料庫;如果設定為True,Yes 或 SSPI,這不能出現Uid和Pwd,将以Windows使用者身份登陸資料庫。強烈推薦用後一種形式,安全性更高。

c.Integrated Security和Persist Security Info同時出現,後者設定為False,可保證資訊安全。

更多字元串連接配接說明請看MSDN:

​​​http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDataSqlClientSqlConnectionClassConnectionStringTopic.asp​​

連接配接字元串的書寫應該熟練後應該沒有什麼問題,我是再看别人的程式,說實話有些東東還真不清楚。但連接配接不上的問題出現後,得解決呀。是以必須要弄懂這些關鍵字的意義,修改後再測試。

2、SQL Server的使用者設定

問題一、采用連接配接字元串

SqlConnection conn = new SqlConnection(" Uid=sa;Pwd=***;Initial Catalog=Northwind;Data Source=LocalHost;Connect Timeout=900");

錯誤:

使用者"sa"登陸失敗,沒有可信任的Sql Server連接配接

查資料後找到解決方法:

原因:Sql Server的驗證方式需要設定為Sql Server驗證和Windows內建驗證的混合方式,如果僅設定為後一種方式,就會出像上述問題

解決:運作Sql Server的企業管理器,點選伺服器,在右鍵菜單中選擇屬性,選安全性,更改驗證方式即可

問題二、采用連接配接字元串

SqlConnection conn = new SqlConnection("Data Source=LocalHost;Integrated Security=SSPI;Initial Catalog=Northwind;");

錯誤:

使用者"computername\IWAM_servername"登陸失敗

原因:SQL Server的登陸使用者中不包括IWAM_servername

解決方法:運作Sql Server的企業管理器,點選伺服器,選安全性,選登陸,建立登陸中加入IWAM_servername,并配備相應的權限,如隻能通路Northwind資料庫,資料庫的角色設定為public和db_owner。

3、關于連接配接的安全性

最好使用SSPI的內建安全方式連接配接資料庫,而sa使用者的方式連接配接會存在安全隐患,我認為主要是因為在安裝SQL Server時,經常會為了通路的友善設定sa的密碼為空,黑客一旦讓sa成為管理者,就可以獲得對系統的所有通路權限。是以為了資料庫的安全,可以設定 SQL server的通路使用者隻能經過windows內建驗證,設定sa的安全密碼,加強資料庫的安全性。當然設定為windows內建驗證後,資料庫的性能和通路的靈活性勢必會受到影響,管理者可以針對每一個資料庫設定不同的驗證方式,而不必對SQL server設定成統一的方式。