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

作者:Tobin Titus

摘要

IIS 7 及更高版本中的配置系统基于分布式的明文 XML 文件,这些文件保存整个 Web 服务器平台(包括 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 服务不同);架构是数据驱动的,是完全声明性的且可发现。

  • 低 TCO:配置可与 Web 内容一起复制;可选的委托管理消除了计算机管理员参与每次配置更改的情况;跨 IIS、ASP.NET 和 Web 服务器平台其余部分的配置设置和模型的统一提供了使用同一组工具和 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 元数据库属性名称的用户可以在新的 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 使用元数据库文件中的路径来指定配置级别(服务、虚拟目录、物理目录)。 整个服务器的配置位于一个文件中。 IIS 7.0 及更高版本默认使用一个文件,但用户可以利用内容目录中的分布式 web.config 文件,这些文件指定其范围的配置设置。
  • IIS 6.0 使用长属性名称来尝试实现自描述配置设置。 这样可以尝试提高文件的可读性并帮助用户了解该属性的作用。 IIS 7.0 及更高版本使用短名称,但它们始终位于特定部分甚至该部分的子元素的上下文中。
  • IIS 6.0 使用 multi-sz(一个字符串属性中的逗号分隔元素)和标志来处理多个元素值,例如 NTAuthenticationProviders。 IIS 7.0 及更高版本使用集合,具有简单的 add/remove/clear 语法,与 .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 使用 ID(数字)来标识设置。 IIS 7.0 及更高版本使用友好的字符串来命名设置。
  • IIS 6.0 使用非直观概念(例如 UserType)和术语(例如 InternalName)。 IIS 7.0 及更高版本使用对人类读者(而不仅仅是应用程序)可以理解的易记名称。

配置文件层次结构

配置的“主控”状态始终是配置文件(与 IIS 6.0 中不同,它是内存中的配置数据库,定期刷新到磁盘)。

在根(或全局)级别,有两个单独的文件:

  • system32\inetsrv\config\applicationHost.config:保存 Web 服务器 (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 文件。

配置 include 文件

在某些情况下,让 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 元素。
  • 配置属性:这是一个 [leaf] 配置设置。 表示为 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 配置系统之间的集成。

有关详细信息,建议查看其余配置文档,尤其是“配置内部组成”文档,其中深入介绍了有关系统的更多基础详细信息,包括其设计和体系结构。