了解 IIS 7.0 配置委派

作者:Saad Ladki

介绍

IIS 为其第七个产品版本引入了全新的基于文件的配置系统。 这一全新系统强调适合整个 Web 平台的数据驱动系统,其中 ASP.NET、Indigo 甚至第三方组件等技术都可以使用和扩展此配置存储以容纳任何站点或应用程序属性。

该系统基于以简单清晰的格式定义的 XML 文件,其语法与 ASP.NET web.config 文件类似。 这些配置文件以逻辑分组保存设置,对文件的任何更改都会立即反映在正在修改属性的站点或应用程序上。

这一全新系统还提供委派管理体验,其中:管理员可以允许站点和应用程序所有者修改特定设置;并且这些更改的影响仅限于相关的特定站点或应用程序。 该模型引入了独立应用程序的概念,其中内容和配置设置都保存在站点或应用程序目录中,并且可以从一台计算机复制部署到另一台计算机。

配置文件和配置架构

IIS 7.0 及更高版本有一个名为 applicationHost.config 的中央配置文件,位于 %WINDIR%\System32\InetSrv\Config\。 该文件替换了 IIS 6.0 用于其配置存储的metabase.xml 文件。 这个新的配置系统非常简单,基于文件,但功能十分强大。 没有配置服务,因为不需要 IISADMIN。 每个工作进程都有一个配置读取器组件的实例,并直接从文件中获取配置。

此外,配置没有内存表示。 一旦对文件发出更改,工作进程就会立即拾取该更改并反映在给定站点、应用程序或虚拟目录上。

applicationHost.config 文件包含 IIS 和其他 Web 技术的不同功能和组件的全局设置。 此文件中设置的任何属性都将应用于计算机中的所有站点、应用程序和虚拟目录。

IIS 使用的配置读取器了解每个配置节、元素和属性的格式、语法和正确命名,因为它们是在架构文件中定义的。 配置架构在位于 %WINDIR%\System32\InetSrv\Config\Schema\ 目录中的文件中定义。 实例化配置系统后,工作进程将架构读取到内存中,这有助于系统了解可设置的属性及其格式。 至少 IIS_schema.xmlASPNET_schema.xmlFX_schema.xml 文件位于此目录中,并分别定义适用于 IIS、ASP.NET 和 .NET Framework 功能的部分的配置结构。

该架构定义配置及其配置节节的几个方面,例如配置节和属性的命名、值的预期类型、这些值的范围或者其中任何一个值是唯一的还是必需的。 此外,它还定义了特定属性将采用的默认值。 在 applicationHost.config 中未定义属性的给定情况下,其值取自架构文件中声明的默认设置。

除了中心文件 applicationHost.config 之外,多个 web.config 文件还可能会出现在 URL 层次结构的任何级别。 这些文件可能会出现在站点、应用程序、虚拟目录甚至物理路径级别。 这些文件定义的属性的值会覆盖 applicationHost.config 中定义的全局设置。但是,这些更改仅适用于文件出现的范围,即适用于 web.config 文件所在的给定站点、应用程序、虚拟目录或物理路径。

配置层次结构和有效配置

除了 applicationHost.config 之外,IIS 还使用 ASP.NET,它依赖于 machine.config根 web.config 文件。 machine.config 文件定义所有框架功能所需的属性。 根 web.config 文件定义为所有 ASP.NET Web 应用程序定义的属性的全局设置。 这两个文件类似于 IIS 的 applicationHost.config。 之所以会出现这三个文件,是因为 .NET Framework 和 IIS 版本不同。 具有单个 IIS 版本的给定 Windows Server 系统中可以安装多个版本的框架。

因此,为系统的配置设置定义并计算配置层次结构。 层次结构从 machine.config 开始,然后是根 web.config 文件,最后是 applicationHost.config。在那里,位于站点、应用程序或虚拟目录级别的任何可选 web.config 文件都会添加并应用到层次结构。 最后,属性从 machine.config 继承到最后一个 web.config 文件(如果有),并计算给定路径的有效配置。

继承行为默认完成。 层次结构中较低级别的任何设置会覆盖在高于当前级别的文件中定义的父设置。 然而,进一步深入层次结构,配置的作用域更加有限。 machine.config、根 web.config 和 applicationHost.config 文件的设置适用于系统中的所有内容,而可选 web.config 文件的设置仅适用于当前位置及以下位置(无论是站点、应用程序还是虚拟目录)。

配置节

在配置文件中,有一些可以读取和设置的设置。 这些设置以结构化方式分组。 类似或适用于特定功能(即 ASP、身份验证、ISAPI 等)的多个设置在称为配置节的逻辑单元块中分组在一起。 每个配置节可以包含其中的其他配置节,但最常见的内容是定义元素、集合或属性。

配置元素是定义多个配置属性的 XML 元素。 配置集合是配置元素的一种特殊情况,其中包含使用添加/移除/清除配置指令定义的元素列表。 最后,配置属性是表示 XML 属性的叶配置设置。

以下代码片段显示了 <defaultDocument> 部分的设置。 enabled 一词是一个属性,其中 files 一词是一个元素,其中包括由 add 指令定义的其他元素的列表和一系列属性。

<defaultDocument enabled="true"> 
    <files> 
        <add value="Default.htm" /> 
        <add value="Default.asp" /> 
        <add value="index.htm" /> 
        <add value="index.html" /> 
        <add value="iisstart.htm" /> 
        <add value="default.aspx" /> 
    </files> 
</defaultDocument>

此配置部分具有关联的架构。 以下代码段显示了文件 IIS_schema.xml 中 <defaultDocument> 节的架构。 该架构定义节的名称及其出现的命名空间(在本例中为 system.webServer)。 此外,该模式还描述了属性和元素,以及每个属性和元素的名称、类型、默认值和其他有趣的数据。

<sectionSchema name="system.webServer/defaultDocument"> 
    <attribute name="enabled" type="bool" defaultValue="true" /> 
    <element name="files"> 
      <collection addElement="add" clearElement="clear" removeElement="remove" mergeAppend="false"> 
        <attribute name="value" type="string" isUniqueKey="true"/> 
      </collection> 
    </element> 
</sectionSchema>

特殊节:<configSections>

<configSections> 配置节是在 applicationHost.config 中定义的一个特殊节。它用作 IIS 服务器配置节的注册表点。 此部分是注册系统中可用的当前配置节的位置。 在扩展配置系统并向服务器添加自定义部分的给定情况下,必须通过向该节添加元素条目来注册它。

以下代码片段显示了 <defaultDocument> 节的 <configSections> 条目。 为了清楚起见,其他条目已被省略。 <configSections> 中有趣的部分是定义每个节的命名空间的节组条目,在本例中为 system.webServer 和 overrideModeDefault 属性的值,对于该节来说。该值是“Allow”。 由于未声明 allowDefinition,因此它是从架构中获取的,默认值为“Everywhere”。

<configSections> 
    <sectionGroup name="system.webServer"> 
        <section name="defaultDocument" overrideModeDefault="Allow" />
    </sectionGroup>
</configSections>

除了定义节及其节组之外,还定义了两个关键属性:overrideModeDefaultallowDefinition

overrideModeDefault 属性是一个可选属性,用于定义节的锁定状态。 其可用值为 AllowDeny。 默认值为“Allow”。 与服务器的任何性能、安全性或关键方面相关的所有 IIS 节均已锁定,并将此属性设置为“Deny”。 如果 overrideModeDefault 属性设置为“Deny”,则为特定配置节的属性设置值的任何较低级别的配置文件(即 web.config 文件)都无法生效并覆盖全局值。 这会导致锁冲突并发生错误。

allowDefinition 属性是另一个可选属性,它定义可以在其中定义节和设置属性的层次结构的级别。 如果其值为 MachineOnly,则只能在 applicationHost.config 或 machine.config 中设置该节。如果其值为 MachineToRootWeb,则可以在 MachineOnly 文件或根 web.config 中设置该节。如果其值为 MachineToApplication,则该节可以在所有前面的三个文件中设置,也可以在应用程序根文件夹中的 web.config 文件中设置。 最后,如果其值为 Everywhere(默认值),则可以在任何配置文件中设置它,无论是影响全局配置的配置文件还是应用于给定站点、应用程序或虚拟目录的 web.config 文件。

位置的概念

配置层次结构的给定文件中指定的任何设置都适用于该级别及以下级别,并且可能被子文件覆盖。 但是,可以选择使用带有路径属性的 location 标记来指定配置设置并将其应用到当前配置文件下的某些路径。 如果配置文件是 applicationHost.config,则位置标记可以包括从系统中的所有站点、应用程序和虚拟目录到特定站点、应用程序、虚拟目录或文件的路径。 位置标记也可以在 web.config 文件中指定,它可以包含当前站点、应用程序或虚拟目录下路径的任何相对路径。

以下代码片段显示如何指定仅适用于开发人员站点的配置属性。 这也可以通过网站内容中的 web.config 文件来实现。 开发人员站点的有效配置将是 applicationHost.config 中文件集合的条目列表,以及站点的位置路径和任何 web.config 文件。

<location path="Developer Site" overrideMode="Allow"> 
    <defaultDocument enabled="true"> 
        <files> 
            <add value="Developer.htm" /> 
        </files> 
    </defaultDocument> 
</location>

如果没有声明路径,相当于指定一个点 (.),则该路径将被理解为从该级别及以下到所有子路径。 在 applicationHost.config 中执行此操作也会指定全局级别的配置。

可以在位置标记中定义的属性是 overrideMode。 与 overrideModeDefault 类似,这指定是否可以在层次结构的较低级别编辑和覆盖当前位置标记中引用的给定配置节和属性集。

锁定和解锁节

可以采用通过 <configSections> 节中的 overrideModeDefault 标记锁定节的初始概念,并将其扩展为更细粒度。 通过允许在 <configSections> 级别覆盖某个节,系统中的任何人都可以通过 URL 命名空间任何级别的 web.config 文件打开该节,并且系统中的任何人都可以覆盖其值。 然而,这可能会带来严重的安全隐患,并可能对系统的可用性或性能造成负面影响。 通过位置标记,可以使用 overrideMode 属性,指定节的锁定状态并针对给定路径实施约束。

以下代码片段显示了如何解锁系统中所有站点、应用程序和虚拟目录的 <windowsAuthentication> 节。 这是通过在 overrideModeDefault 属性中设置“Allow”来完成的。 这种方法的缺点是它为每个人都解锁了节,任何人都可以通过 web.config 文件覆盖其站点或应用程序级别的设置。

<section name="windowsAuthentication" overrideModeDefault="Allow" />

以下代码片段显示了如何实现相同的目的,即解锁 <windowsAuthentication> 节,但仅限于 AdministratorSite,以便可以通过站点 AdministratorSite 级别的 web.config 文件修改该节的属性。 系统中的其他站点默认会锁定 <windowsAuthentication> 节。 这是通过 overrideMode 属性完成的。

<location path="AdministratorSite" overrideMode="Allow"> 
   <security> 
        <authentication> 
            <windowsAuthentication enabled="false"> 
                <providers> 
                    <add value="Negotiate" /> 
                    <add value="NTLM" /> 
                </providers> 
            </windowsAuthentication> 
        </authentication> 
   </security> 
</location> 
 
The location tag path can be specified here a site, application or even a virtual directory to which the administrator wants to unlock configuration and/or apply configuration at that level.

可以执行相反的行为,即针对特定站点锁定节,而系统的其余部分则可以对其进行编辑。 例如,<defaultDocument> 是一个在 <configSections> 节中将 overrideModeDefault 属性设置为“Allow”的节,但通过位置标记,我们可以针对基本站点锁定此节。 以下代码片段展示了如何完成此操作,同时进行设置,以便系统接受作为服务器显示为主页的默认页面的唯一值的标题为 basic.htm。 clear 指令为配置层次结构中上述级别的继承值 null,在本例中,这是 applicationHost.config 中文件的全局列表。

<location path="Basic Site" overrideMode="Deny"> 
    <defaultDocument enabled="true"> 
        <files> 
       </clear> 
            <add value="basic.htm" /> 
        </files> 
    </defaultDocument> 
</location>

粒度锁定

通过位置标记打开某个节是为指定路径的站点或应用程序的所有者解锁某个节及其所有属性的有效方法。 这实际上是一种全有或全无的方法,让网站和应用程序所有者可以无限制地访问某个节。 但有时,管理员希望对某个节中的某些属性进行特定控制,并希望控制某些值。 可以委派其他节。 这就是粒度锁定发挥作用的地方。

粒度锁定是可以在元素或其他属性上设置的一组特定属性。 粒度锁定可以声明当前路径以下的路径是否可以修改配置值。 可以读取值,但如果设置了锁定,则无法编辑甚至声明它们。 不要编辑已设置锁定的值,因为这会导致配置锁定冲突错误。

粒度锁定分组中的第一个属性是 lockAttributes。 lockAttributes 定义了一个以逗号分隔的属性列表,这些属性对当前配置级别以下的路径锁定。 它还接受星号 (*) 作为其值,这意味着所有属性都被锁定。 此时,可以在子级路径中读取配置节,甚至可以读取锁定的属性,但编辑受保护的属性会导致错误。

以下代码片段显示如何锁定开发人员站点 <defaultDocument> 节的启用状态。 如果开发者站点的所有者禁用默认文档功能,甚至声明属性的值与位置标记中声明的值相同,则会发生锁定冲突。

<location path="Developer Site" > 
    <defaultDocument enabled="true" lockAttributes="enabled" /> 
</location>

粒度锁定分组中的第二个属性是 lockElements。 lockElements 定义了一个以逗号分隔的元素列表,这些元素对当前配置级别以下的路径锁定。 与 lockAttributes 一样,它也接受星号 (*) 作为其值,这意味着所有元素都被锁定。 这对于具有多个元素或集合并且需要保护子级路径的配置节非常有用。 同样,编辑任何锁定值都会导致错误。

以下代码片段显示了如何锁定开发人员站点的文件集合。 这使站点所有者可以决定是否启用默认文档功能;但是,如果启用,它将无法修改全局值,并且会继承计算机管理员在 applicationHost.config 中声明的内容。

<location path="Developer Site"> 
    <defaultDocument enabled="true" lockElements="files" > 
        <files> 
            <add value="Developer.htm" /> 
        </files> 
    </defaultDocument> 
</location>

lockElement 示例在集合中也很有用,可以锁定此类集合的指令。 这些指令是关键字,例如添加、移除、清除集合。 通过锁定指令,管理员可以对集合列表是否可用于添加或移除某些或所有元素进行微调。

以下代码片段显示如何锁定文件集合中当前条目的移除和清除。 网站所有者可以根据需要将新条目添加到文件集合中。 如果网站所有者指定了清除标记或尝试移除条目,则会发生锁定冲突。

<location path="Developer Site"> 
    <defaultDocument enabled="true" > 
        <files lockElements="clear,remove"> 
            <add value="Developer.htm" /> 
        </files> 
    </defaultDocument> 
</location> 
 
Besides lockAttribute and lockElement, there are negative counterparts: lockAllAttributesExcept, and lockAllElementsExcept. These attributes achieve  the inverse action of the previous ones in which the comma-separated list declares the attributes and elements to be unlocked while the rest are not  available to be edited in child paths.

还有一个 lockItem 属性。 这会锁定属性并在 XML 属性级别工作。 以下代码片段显示了站点管理员如何才能执行她要执行的任何操作,例如添加或移除集合中的条目,但修改文件集合中的 basic.htm 条目除外。

<location path="Developer Site"> 
    <defaultDocument enabled="true" > 
        <files> 
            <add value="basic.htm" lockItem="true"/> 
        </files> 
    </defaultDocument> 
</location>

总结

本文档提供了配置系统、其文件、架构和委派功能的基本概述。 它还讨论了配置层次结构和有效配置。 本文还介绍了配置节及其元素和属性的结构。 它举例说明了位置、锁定和粒度锁定的概念。

总体而言,IIS 引入了新的基于文件的配置系统,该系统具有将所有配置放在一个中央配置文件中或通过 web.config 文件进行分发的功能,其中,站点和应用程序管理员能够修改适用于其应用程序和内容的属性。 通过分布式配置模型,启用了独立应用程序的概念,其中内容和配置设置都保存在站点或应用程序目录中,并且可以从一台计算机 x-copy 部署到另一台计算机。