消費者入門 IIS 7 和更新版本中的設定

作者 :Tobin Titus

摘要

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

簡介

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

新的組態系統設計為:

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

  • 低 TCO:設定可以與 Web 內容一起進行 xcopied;選擇性委派的系統管理可避免電腦系統管理員在每個設定變更仲介入;跨 IIS 統一組組態設定和模型,ASP.NET 和 Web 服務器平臺的其餘部分,提供一次性的商店來管理 (伺服器,例如,web.config檔案可能包含 IIS 和 ASP.NET 設定,而且兩者之間都有一個位置來控制驗證、授權、自訂錯誤) 等功能;備份、還原、安全性管理 (ACL) 是以標準檔案系統工具和程式為基礎。

  • 安全:安裝 IIS 時,設定狀態會位於一個僅受電腦系統管理員存取保護的檔案中;預設不會啟用委派;預設不會儲存任何敏感性資訊 (,例如密碼) ;需要將敏感性資訊寫入組態檔時,系統會自動在磁片上加密;個別應用程式組態可以在專用的檔案中 (受到檔案系統 ACL 保護) ,讓其他應用程式無法共用或讀取設定。

  • 可延伸:新增至架構只是將 XML 檔案卸載至 schemas 資料夾;不需要呼叫 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 使用多 sz (一個字串屬性中的逗號分隔元素) 和旗標來處理多個元素值,例如 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 屬性來完成。 目前僅限於指向子目錄中的相對實體路徑,基於安全性考慮, (亦即,如果 B 位於 A) 的實體子目錄中,則檔案 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 (,稱為集合指示詞) 。 表示為具有 add > 、 < remove > 、 < clear > 子項目的 < XML 專案。
  • 組態屬性:這是 [分葉] 組態設定。 表示為 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 內建函式檔,這會進入更低階的系統詳細資料,包括其設計和架構。