共用方式為


HOW TO:使用 Windows 整合式安全性存取 SQL Server

更新:2007 年 11 月

如果應用程式是在 Windows 架構的內部網路上執行,則可對資料庫存取使用 Windows 整合式驗證。整合式安全性使用在作業系統執行緒上建立的目前 Windows 識別 (Identity),以存取 SQL Server 資料庫。接著,您可以將 Windows 識別對應至 SQL Server 資料庫和使用權限。

若要使用 Windows 整合式驗證連接至 SQL Server,您必須識別執行 ASP.NET 應用程式的 Windows 識別。您還必須確保已授與該識別存取 SQL Server 資料庫的權限。本主題包含顯示 ASP.NET 應用程式之目前 Windows 識別的程式碼範例。

連接到 SQL Server

如果 SQL Server 在 Web 伺服器以外的其他電腦上,則 Windows 識別必須能夠在網路上流動至 SQL Server 的遠端執行個體 (已使用 Kerberos 驗證正確設定的 Windows 網路都可以如此)。不過,根據 identity 組態項目中的設定,在作業系統執行緒上為 ASP.NET 應用程式建立的 Windows 識別可能無法正確流動至遠端 SQL Server。

您可以提供網站之背景工作處理序識別的特定使用者名稱和密碼 (如 HOW TO:以對應的 Windows 網域使用者身分存取 SQL Server所示),或者模擬網際網路資訊服務 (IIS) 提供的已驗證識別。若要模擬 IIS 提供的 Windows 識別,請將 identity 組態項目的 impersonate 屬性 (Attribute) 設為 true,如下列範例所示:

<system.web>
  <identity impersonate="true" />
</system.web>

在 IIS 中,只有基本驗證才會使用在網路上流動至遠端 SQL server 的安全性語彙基元 (Token) 來登入使用者。根據預設,與 identity 組態項目設定搭配使用的其他 IIS 安全性模式不會產生可對遠端 SQL Server 進行驗證的語彙基元。

如果網站已設定為只支援 IIS 中的匿名存取,則從 IIS 傳遞的安全性語彙基元將會是 IIS 中設定用於匿名存取的 Windows 使用者帳戶。匿名使用者帳戶可用於對遠端 SQL Server 進行驗證。不過,因為預設匿名使用者帳戶是本機電腦帳戶,所以,在遠端 SQL Server 上不會有這一個帳戶。您可以將 IIS 匿名帳戶變更為使用網域帳戶,也可以在遠端 SQL Server 上鏡像本機電腦帳戶,方法是在遠端 SQL Server 上使用相同的使用者名稱和密碼建立本機帳戶。此外,IIS6 的 LogonMethod Metabase 屬性必須設為允許認證在網路上流動的選項。例如,Metabase 設定 MD_LOGON_NETWORK_CLEARTEXT 允許登入認證在網路上流動。

如果您不確定應用程式的 Windows 識別,也不確定該識別是否使用可在網路上流動的語彙基元進行登入,您可以將下列 ASP.NET Web 網頁做為應用程式的一部分執行,以顯示 Windows 識別的名稱以及指出識別是否可以在網路上流動的值。請注意,下列範例未考量是否已為網域成功設定 Kerberos 委派。

<%@ Page Language="VB" %>
<%@ Import namespace="System.Security.Principal" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>ASP.NET Example</title>
<script >

Public Function WillFlowAcrossNetwork(w As WindowsIdentity) As Boolean
  For Each s As SecurityIdentifier In w.Groups
    If s.IsWellKnown(WellKnownSidType.InteractiveSid) Then Return True
    If s.IsWellKnown(WellKnownSidType.BatchSid)       Then Return True
    If s.IsWellKnown(WellKnownSidType.ServiceSid)     Then Return True
  Next

  Return False
End Function

</script>
</head>
<body>
<%
  Dim current As WindowsIdentity =  WindowsIdentity.GetCurrent()
  Response.Write(current.Name & ", " & WillFlowAcrossNetwork(current) & "<br />")
%>
</body>
</html>
<%@ Page Language="C#" %>
<%@ Import namespace="System.Security.Principal" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>ASP.NET Example</title>
<script >

public bool WillFlowAcrossNetwork(WindowsIdentity w)
{
  foreach (SecurityIdentifier s in w.Groups)
  {
    if (s.IsWellKnown(WellKnownSidType.InteractiveSid)) { return true; }
    if (s.IsWellKnown(WellKnownSidType.BatchSid))       { return true; }
    if (s.IsWellKnown(WellKnownSidType.ServiceSid))     { return true; }
  }

  return false;
}

</script>
</head>
<body>
<%
  WindowsIdentity current =  WindowsIdentity.GetCurrent();
  Response.Write(current.Name + ", " + WillFlowAcrossNetwork(current) + "<br />");
%>
</body>
</html>

下列程序示範如何在內部網路案例中使用 Windows 整合式驗證存取 SQL Server 資料庫,並已分別授與每位使用者存取 SQL Server 的權限。

若要開始,您需要在 IIS 中設定應用程式,以關閉匿名存取並開啟 Windows 驗證。

若要為 Windows 整合式驗證設定 IIS

  1. 在 Windows 中,開啟 [網際網路資訊服務] 管理工具。

    • 在 Microsoft Windows 2000 Server 或 Windows Server 2003 作業系統中:在 Windows 的 [開始] 功能表中,依序指向 [程式集]、[系統管理工具] 和 [網際網路服務管理員]。

    • 在 Microsoft Windows XP Professional 作業系統中:在 [控制台] 開啟 [系統管理工具]。

  2. 開啟您伺服器的節點,然後繼續開啟節點直到找到您應用程式的節點為止,通常位在 [預設的網站] 下。

  3. 以滑鼠右鍵按一下應用程式,然後按一下 [內容]。

  4. 在 [目錄安全性] 索引標籤上,按一下 [編輯]。

  5. 在 [驗證方法] 對話方塊中,清除 [匿名存取] 核取方塊,然後執行下列其中一項:

    • 如果 SQL Server 與 IIS 在同一台電腦上,請選取 [整合式 Windows 驗證] 核取方塊。

    • 如果 SQL Server 為遠端伺服器,請選取 [基本驗證] 核取方塊,並清除 [整合式 Windows 驗證] 核取方塊。

  6. 按一下所有對話方塊。

在應用程式組態檔 (Web.config) 中,指定應用程式將模擬使用者由 IIS 提供的認證。

若要設定 Web.config 模擬 IIS 提供的識別

  • 開啟應用程式的 Web.config 檔,再將下列內容加入 system.web 項目:

    <identity impersonate="true"/>
    
    注意事項:

    Web.config 中的項目是區分大小寫的。

在建立連接字串 (Connection String) 存取 SQL Server 時,必須加入屬性,告知 SQL Server 您正在使用整合式安全性。

若要為 Windows 整合安全性設定連接字串

  • 在任何 SQL Server 的連接字串中,加入屬性 Trusted_Connection=Yes,並移除使用者名稱和密碼屬性。

    以下示範為 Windows 整合安全性設定的典型連接字串:

    "workstation id=WebServer1;packet size=4096;
    Trusted_Connection=Yes;data source=SQLServer01";
    persist security info=False;initial catalog=northwind"
    

設定 SQL Server 以辨識將存取它的使用者。

若要為 Windows 整合安全性設定 SQL Server

  1. 從 Windows 的 [開始] 功能表中,選取 [Microsoft SQL Server],然後選取 [Enterprise Manager]。

  2. 開啟伺服器的節點,展開您要授與使用者使用權限的資料庫節點。

  3. 以滑鼠右鍵按一下 [使用者] 節點,然後選取 [新增資料庫使用者]。

  4. 在 [資料庫使用者屬性] 對話方塊中,在 [登入名稱] 方塊中輸入 domain\username,然後按一下 [確定]。此外,也可以設定 SQL Server 允許所有網域使用者存取資料庫。

請參閱

概念

ASP.NET 模擬

從 Web 應用程式存取 SQL Server

其他資源

保護 ASP.NET 網站