共用方式為


IIS 7 及更高版本中的配置入門

by Tobin Titus

摘要

IIS 7 和更新版本中的組態系統是以分散式、純文本的 XML 檔案為基礎,這些檔案會保存整個網頁伺服器平臺的元件設定,包括 IIS、ASP.NET 和其他元件,而且可以選擇性地設定在內容目錄與 Web 內容一起設定。 不同層級的組態階層可能會由計算機管理員委派給其他使用者,例如月臺管理員或應用程式開發人員。 保護預設和現用鎖定限制僅限計算機系統管理員對組態設定的寫入許可權;不過,複雜且細微的鎖定功能可針對 Web 命名空間的範圍,安全地解除鎖定和委派管理特定組態設定給更多使用者。 系統在 API 層級與舊版 IIS 具有向後相容性,而在 XML 層級與舊版 .NET Framework 具有向後相容性。 本檔提供新組態系統的一般概觀。

簡介

IIS 中的組態系統是以分散式、純文本的 XML 檔案為基礎,這些檔案會保存整個 Web 伺服器平臺的組態設定,包括 IIS、ASP.NET 和其他元件,而且可以選擇性地設定在內容目錄中與 Web 內容一起設定。 不同層級的組態階層可能會由計算機管理員委派給其他使用者,例如月臺管理員或應用程式開發人員。 預設保護和即時鎖定僅限於讓計算機系統管理員對配置設定具有寫入權限;然而,複雜且具體的鎖定功能允許針對 Web 命名空間的管理範圍,安全地解除鎖定和將特定配置設定的管理委派給更多使用者。 系統在 API 層級上與舊版 IIS 反向相容,在 XML 層級上與舊版 .NET Framework 反向相容。

新的組態系統設計為:

  • 簡單:所有狀態都在檔案中;未使用專屬存放區;沒有記憶體內部組態資料庫是組態狀態的實際主要資料庫(不同於 IIS 6.0 中的 IISADMIN 服務):架構為數據驅動,且為 100% 宣告式且可探索。

  • 低 TCO:設定可以搭配 Web 內容進行 xcopi 處理;選擇性委派的系統管理可避免計算機系統管理員參與每個設定變更;跨 IIS 統一組組態設定和模型,ASP.NET 和網頁伺服器平台的其餘部分,提供一站式服務來管理伺服器,使用同一組工具和 API(例如,web.config 檔案可能包含 IIS 和 ASP.NET 設定,而且兩者之間都有一個位置來控制驗證、授權、自定義錯誤等功能:備份、還原、安全性管理 (ACL) 是以標準檔案系統工具和程式為基礎。

  • 安全:安裝 IIS 時,組態狀態會位於僅受計算機系統管理員存取保護的一個檔案中;默認不會啟用委派;預設不會儲存任何敏感性資訊(例如密碼) ;當敏感性資訊需要寫入組態檔時,它會自動在磁碟上加密;個別應用程式組態可以在專用檔案中進行沙箱和隔離(由檔案系統 ACL 保護),讓其他應用程式無法共用或讀取設定。

  • 可延伸:新增至架構只是將 XML 檔案卸除至架構資料夾的問題;不需要呼叫 API 或執行工具來擴充架構;這些設定會以邏輯相關的區塊組織起來,稱為「區段」(就像在 .NET Framework 組態中一樣),而且新增新區段很容易(不需要撰寫任何程序代碼 ,不像在 .NET Framework 組態中):從伺服器模組或應用程式讀取自定義區段設定很簡單且直接。

  • 相容:現有的 IIS 應用程式可以繼續呼叫介面,例如系統管理基底物件(ABO)、IIS ADSI 提供者和 IIS 6.0 WMI 提供者;現有的 .NET Framework 應用程式可以繼續呼叫介面,例如 System.Configuration 和 System.Web.Configuration;熟悉 machine.config 和 web.config XML 格式的使用者將繼續在這些檔案中體驗相同的格式和語法,而且他們將能夠手動編輯遵循相同格式和模型的 IIS 設定:熟悉 IIS Metabase 屬性名稱的使用者會在新的 IIS 7.0 和更新版本組態檔中找到屬性的相同名稱。

清除模式

以下是示範組態架構的範例。

它會示範如何在 IIS 6 和 IIS 7.0 和更新版本中組織驗證設定。

備註

不熟悉 IIS 6.0 概念的讀者可以直接忽略與 IIS 6.0 的比較,並唯讀取 IIS 7.0 和上述概念和優點。

我們會先比較在檔案中保存組態的方式,然後查看架構定義。

在組態檔本身中:

//
// Snippet from IIS 6.0 Metabase.xml
//
<IIsWebService    Location ="/LM/W3SVC"
      ... many lines here ...
    AuthFlags="AuthAnonymous"
      ... many lines here ...
    >
</IIsWebService>
<IIsWebDirectory    Location ="/LM/W3SVC/1/ROOT/aspnet_webadmin/2_0_41016"
    AuthFlags="AuthAnonymous | AuthNTLM"
    >
</IIsWebDirectory>
<IIsWebVirtualDir    Location ="/LM/W3SVC/Info/Templates/Public Web Site/Root"
        AuthFlags="AuthAnonymous"
    >
</IIsWebVirtualDir>

//
// Snippet from IIS 7.0 applicationHost.config
//
<anonymousAuthentication enabled="true"  userName="…"  password="" />
<basicAuthentication enabled="false" />
<clientCertificateMappingAuthentication enabled="false" />
<windowsAuthentication enabled="true" >
    <providers>
        <add value="Negotiate" />
        <add value="NTLM" />
    </providers>
</windowsAuthentication>

關鍵要點:

  • IIS 6.0 使用非常長、「一般」的屬性清單。 沒有階層或屬性群組。 在相同清單中的數百個設定中,很難搜尋組態設定。 IIS 7.0 和更新版本會使用區段和區段群組的階層,以及區段內的子元素。 在驗證區段群組或特定驗證區段中搜尋驗證設定,即可輕鬆查閱驗證設定。
  • IIS 6.0 使用旗標來設定驗證配置。 IIS 7.0 和更新版本會針對每個驗證架構使用一個區段,並在每個架構上使用 enabled=“true|false”。 僅與某些驗證配置相關的其他設定只能在相關區段中設定(例如,使用者名稱和密碼只能設定為匿名驗證)。
  • IIS 6.0 使用 Metabase 檔案內的路徑來指定組態層級(服務、虛擬目錄、實體目錄)。 整個伺服器的組態位於一個檔案中。 IIS 7.0 和更新版本預設會使用一個檔案,但使用者可以利用內容目錄中的分散式 web.config 檔案,指定其範圍的組態設定。
  • IIS 6.0 在嘗試進行自我描述組態設定時,使用較長的屬性名稱。 這會嘗試改善檔案的可讀性,並協助使用者了解屬性的功能。 IIS 7.0 和更新版本會使用簡短名稱,但它們一律位於特定區段的內容中,甚至是 區段中的 子元素。
  • IIS 6.0 使用多字串(在一個字串屬性中以逗號分隔的元素)和旗標來處理多個元素值,例如 NTAuthenticationProviders。 IIS 7.0 和更新版本會使用集合,具有簡單的新增/移除/清除語法,與 .NET Framework 組態完全相同。 這可讓階層的較低層級只新增(或移除)它們所需的元素,而不是重複包含(或不包含)該元素的整個數據。 它也提供檔案的更可讀性(這在直接編輯時會轉譯為較少的人為錯誤)。

在架構檔案中:

//
// Snippet from IIS 6.0 MBSchema.xml
//
<Property InternalName="AuthFlags" ID="6000" Type="DWORD" UserType="IIS_MD_UT_FILE" Attributes="INHERIT" >
    <Flag   InternalName="AuthAnonymous"   Value="1"   ID="6218"   />
    <Flag   InternalName="AuthBasic"             Value="2"   ID="6219"  />
    <Flag   InternalName="AuthNTLM"            Value="4"   ID="6220"  />
    <Flag   InternalName="AuthMD5"              Value="16"  ID="6221"  />
    <Flag   InternalName="AuthPassport"        Value="64"  ID="6299"  />
</Property>

//
// Snippet from IIS 7.0 IIS_Schema.xml
//
<sectionSchema name="system.webServer/security/authentication/basicAuthentication">
  <attribute name="enabled" type="bool" defaultValue="false" />
  <attribute name="realm" type="string" />
  <attribute name="defaultLogonDomain" type="string" />
  <attribute name="logonMethod" type="enum" defaultValue="ClearText">
    <enum name="Interactive" value="0" />
    <enum name="Batch" value="1" />
    <enum name="Network" value="2" />
    <enum name="ClearText" value="3" />
  </attribute>
</sectionSchema>

關鍵要點:

  • IIS 6.0 使用標識碼(數位)來識別設定。 IIS 7.0 和更新版本會使用易記字串來命名設定。
  • IIS 6.0 使用非直覺的概念,例如 UserType 和 InternalName 等術語。 IIS 7.0 和更新版本會使用對人類讀者有意義的易記名稱,而不只是應用程式。

配置文件階層

組態的「主要」狀態一律是組態檔(不同於 IIS 6.0,也就是記憶體內部組態資料庫,該資料庫已定期排清到磁碟)。

在根層級 (或全域) 層級,有兩個不同的檔案:

  • system32\inetsrv\config\applicationHost.config:保留網頁伺服器 (IIS) 設定的全域預設值。
  • \windows\microsoft.net\framework\v2.0.50727\config\machine.config:保留 .NET Framework 設定的全域預設值,包括一些 ASP.NET 的預設值(其餘部分位於相同資料夾中的 web.config,有時稱為根 web.config)

造成有兩個獨立檔案的原因是因為這兩種技術版本在排程和產品方面不同。 IIS 是 Windows 的一部分,.NET Framework 在 Visual Studio 版本中可能會獨立版本。

在 Web 內容目錄中,可能會有可選的 web.config 檔案用來控制該階層及其下階層的行為。 它們可以是本機或遠端(例如,如果內容資料夾位於 UNC 共用上)。 它們可能包含 IIS、ASP.NET 或任何其他可在其層級指定的 .NET Framework 組態設定。 根據預設,沒有 web.config 檔案。

就繼承階層而言,根文件是 machine.config,然後在相同目錄中的是 web.config(稱為根 web.config),接著是 applicationHost.config,然後沿著命名空間有選擇性的 web.config 文件。

組態包含檔案

在某些情況下,讓 web.config 檔案包含一些其他 .config 檔案會很有用。 這可以使用 configSource 屬性來完成。 目前僅限於指向子目錄中的相對實體路徑,基於安全性考慮(例如,檔案 A 只能在 B 位於 A 的實體子目錄中時包含檔案 B)。 以下是示範如何使用 configSource 的基本範例:

<!-- in inetsrv\applicationHost.config -->
<configuration>
  <system.webServer>
  
    <!-- mimemaps moved by the customer to a different file -->
    <!-- so that this file is shorter and more readable -->
    <staticContent configSource="staticContent.config"/>
  
    <!-- the rest of system.webServer sections are here… -->
  </system.webServer>
</configuration>
  
<!-- in inetsrv\staticContent.config -->
<configuration>
  <system.webServer>
    <staticContent>
      <!-- all the mimemap definitions are here -->
      <mimeMap ….. />
      <mimeMap ….. />
      <mimeMap ….. />
    </staticContent>
  </system.webServer>
</configuration>

在這裡範例中,客戶想要將 staticContent 區段的內容移至個別的檔案,以便有較短、更容易閱讀 applicationHost.config。

請注意,當組態設定在 .config 檔案中變更時,伺服器會自動偵測到變更並採取行動。 客戶不應該擔心回收應用程式或應用程式集區或整個伺服器(例如,伺服器本身可能會回收應用程式集區,例如,視組態設定變更而定)。

設定的排列

在組態檔中(也就是針對階層的指定層級),設定會以結構化的方式組織,而不是一般清單。 部署、註冊和擴充性的基本單位是組態區段。 區段包含在區段群組中,而該區段可能會包含在父區段群組中。 區段本身不是巢狀的。 區段群組為 。

以下是來自 applicationHost.config的範例:

<!-- section group for web server configuration -->
<system.webServer>
  
  <!-- section group for web server security configuration -->
  <security>
    <!-- section group for web server authentication configuration -->
    <authentication>
  
      <!-- three sections for authentication -->
  
      <basicAuthentcation ... />
      <windowsAutnentication ... />
      <anonymousAuthentication ... />
    </authentication>
  </security>
</system.webServer>

組態設定一律屬於特定區段。

區段群組只存在,以便進行更好的建構;它們沒有直接在它們中設定,只有區段。

在區段中,結構如下所示:

  • 組態元素:包含組態設定和可能其他的組態元素。 表示為 XML 元素。 區段也是元素。
  • 組態集合:組態元素的一個私有實例,其中包含組態元素的清單,格式為 add/remove/clear(這些稱為集合指示詞)。 以 XML 元素表示,其中包含 <add>、 <remove>、 <clear> 子元素。
  • 組態屬性:這是一個[葉節]的組態設定。 表示為 XML 屬性。

以下是來自 applicationHost.config的範例:

<!-- "windowsAuthentcation" is a section which is an element -->
<!-- "enabled" is a property -->
<windowsAuthentication enabled="true">
  
  <!-- "providers" is a collection which is an element -->
  <providers>
  
    <!-- the collection contains two elements -->
    <!-- "add" is the collection directive; "value" is the property -->
    <add value="Negotiate"/>
    <add value=""NTLM/>
  </providers>
</windowsAuthentication>

根據預設,applicationHost.config 包含兩個主要區段群組:system.applicationHost 和 system.webServer。 它也包含名為 <configSections 的>區段,其有點特殊,因為它在內部由組態系統用來註冊所有其他區段。

根據預設,machine.config 包含數個區段群組。 ASP.NET 設定位於 system.web 區段群組中。

位置標籤與組態檔

在許多情況下,我們希望避免在內容目錄中出現 web.config 檔案,但仍需要允許每個 URL 擁有覆寫全域預設值的組態設定。 例如:系統管理員想要指定特定網站必須使用某些驗證配置,而網站管理員(以及該網站的應用程式開發人員)必須無法將其關閉。

若要達成此目的,最簡單的方式是使用位置標籤。 這是一種機制,可指定特定路徑的組態,而不需要在對應至虛擬路徑的資料夾中包含web.config。

此範例示範如何在 applicationHost.config中使用位置標記:

<!-- the following will take effect on MyAdminSite -->
<location path="MyAdminSite">
  <system.webServer>
    <security>
      <authentication>
        <basicAuthentication enabled="false"/>
        <windowsAuthentication enabled="true"/>
        <anonymousAuthentication enabled="false"/>
      </authentication>
    </security>
  </system.webServer>
</location>

位置標籤可用來指定全域層級(path=".")、網站層級或網站內特定路徑的組態設定。 檔案中可以有多個位置標記。 位置標籤可以位於任何 .config 檔案中,而不只是 applicationHost.config 或 machine.config。

位置標籤也可用於鎖定和解除鎖定區段。 詳細信息可在設定鎖定課程中找到。

在某些情況下,沒有使用位置標籤的替代方案:

  • 對應至相同實體資料夾的兩個或多個虛擬路徑。 顯然,如果兩個虛擬路徑有不同的組態,就無法在 web.config 檔案中指定,因為它已共用。
  • 檔案特定的組態。 沒有單個檔案的 web.config 檔案; 它僅適用於整個資料夾。

總結

本檔提供 IIS 7.0 和更新版本之組態系統的初始、高階概觀。 它重點強調了更簡潔的模式格式;組態系統的分散式本質,以及如何將組態設定委派給網站擁有者或應用程式開發人員;在組態檔中的設定結構化組織;以及與 IIS 和 ASP.NET 組態系統的整合。

如需詳細資訊,建議您檢閱其餘的組態檔,特別是 Configuration Intrinsics 檔,其中會深入探討系統的較低層級詳細數據,包括其設計和架構。