作者 :Tobin Titus
摘要
IIS 7 及更高版本中的配置系统基于分布式、明文、XML 文件,这些文件保存整个 Web 服务器平台的配置设置,包括 IIS、ASP.NET 和其他组件,并且可以选择性地与 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 内容一起使用 xcopy 复制;可选的委派管理消除计算机管理员参与每次配置更改的必要;在 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 使用多字符串属性(其中元素以逗号分隔)和标志来处理多个元素值,例如 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 使用 ID(数字)来标识设置。 IIS 7.0 及更高版本使用友好字符串来命名设置。
- IIS 6.0 使用非直观的概念,例如 UserType 和 InternalName 等术语。 IIS 7.0 及更高版本使用对人类读取器有意义的友好名称,而不仅仅是应用程序。
配置文件层次结构
配置的“master”状态始终是配置文件(与 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 的一部分,作为 Visual Studio 版本的一部分,.NET Framework 可以独立版本。
在 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,若 B 位于 A 的物理子目录中)。 下面是演示如何使用 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 元素,其中包含 <添加>、 <删除>、 <清除> 子元素。
- 配置属性:这是一个 [叶] 配置项。 表示为 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 文件;web.config 文件仅适用于整个文件夹。
概要
本文档提供了 IIS 7.0 及更高版本中配置系统的初始高级概述。 它突出显示了更简洁的架构格式;配置系统的分布式性质及其如何允许将配置设置委派给站点所有者或应用程序开发人员;配置文件中设置的结构化组织;以及 IIS 与 ASP.NET 配置系统的集成。
有关详细信息,建议查看配置文档的其余部分,特别是 Configuration 内部函数文档,该文档将深入到有关系统的更低级别的详细信息,包括其设计和体系结构。