如何在 IIS 7.0 配置中使用锁定
作者:Saad Ladki
摘要
本文档介绍如何在服务器上锁定和解锁配置。 你将了解应用程序级配置文件可以替换哪些设置,以及如何使用 <location>
元素锁定整个节。
你将尝试在节内对配置设置进行更精细的锁定,例如:
- 锁定特定元素和属性
- 锁定除特定元素或属性以外的所有内容
- 锁定特定的集合指令,例如
<add>
、<remove>
和<clear>
指令 - 锁定集合中的特定元素
阅读本文档后,你将了解如何通过直接编辑配置文件中的 XML 元素来管理配置锁定的不同功能(执行这些任务的编程接口与 XML 结构非常相似)。
本文档只重点介绍在配置文件中编辑 XML 元素,而不是显示使用管理 API、脚本或用户界面 (UI) 完成相同任务的方法。
介绍
IIS 7.0 及更高版本允许锁定和解锁各种级别和范围内的配置设置。 锁定配置意味着不能在层次结构的较低级别上替换它(或根本无法设置)。 解锁配置只能在锁定的级别完成。 例如,为不同的站点或路径创建不同的配置时,这非常有用,只允许某些站点和路径替换它。 可以在节级别或节内针对特定元素、属性、集合元素和集合指令完成锁定。
任务 1:使用 <location>
标记锁定节
在此任务中,你将了解如何使用 <location>
标记在全局级别锁定(或解锁)整个配置节,以便无法在配置层次结构的应用程序级别替换它们。
注意
默认情况下,applicationHost.config 中的大多数 IIS 节均已锁定,并且 .NET Framework 均未锁定(包括 machine.config 和 root web.config 中 <system.web> 节组中的 ASP.NET 节)。
使用文本编辑器(如记事本)在以下位置打开 applicationHost.config 文件:
%windir%\system32\inetsrv\config\applicationHost.config
在文件顶部查看 <configSections>
节:它包含此文件中配置节的元数据,例如节的名称、包含的节组以及它们是否被锁定。
锁定的节由“overrideModeDefault”属性指定,为“允许”或“拒绝”。 默认情况下,很少节未锁定,例如由此行指定:
<section name="defaultDocument" overrideModeDefault="Allow" />
在这里,我们将处理 <windowsAuthentication>
节。 它默认处于锁定状态。
若要解锁服务器上的所有应用程序的整个节,请将其内容从文件中的当前位置移动到文件底部,并将其放入 <location overrideMode="Allow">
元素中。 记得围绕它的节组:<system.webServer
>,然后 <security
>,最后 <authentication
>。 最终结果应如下所示:
<location overrideMode="Allow">
<system.webServer>
<security>
<authentication>
<!-- the content of windowsAuthentication section is here -->
</authentication>
</security>
</system.webServer>
</location>
该节现已为所有应用程序解锁。 可以在位置标记上指定路径,以便仅针对此路径解锁该节。 如果未指定默认路径(如上一步所示),则 path="."(或 path="",意思相同),这意味着“此当前级别”。 在这种情况下,由于这是 applicationHost.config,因此当前级别表示全局级别。 还可以在命名空间层次结构中的任意位置(例如,在 vdir 级别的 web.config 中)使用位置标记将配置从此点向下锁定配置。
下面是一个示例,说明如何仅针对“AdminSuperTrusted”站点解锁此节。 这意味着该节上的 web.config 文件可以替换本节中的设置;但是,对于框中的所有其他网站,锁定是全局级别的,无法替换。
在此示例中,必须将节的内容保留在 applicationHost.config 中的原始位置,然后使用特定路径在位置标记中指定节:
<location path="AdminSuperTrustedSite" overrideMode="Allow">
<system.webServer>
<security>
<authentication>
<!-- note: this is different than previous example, in that -->
<!-- the content of the section is in the original place and -->
<!-- was not moved here; in addition, the section is also -->
<!-- specified here, just by its name, so that it gets -->
<!-- unlocked only for the site specified in the location. -->
<windowsAuthentication/>
</authentication>
</security>
</system.webServer>
</location>
返回到上面的第三个示例,为所有站点中的所有应用程序(location path=“.”)解锁该节。 检查主<身份验证>节组(上述文件的 <location>
元素外部)是否不包含 <windowsAuthenitcation> 节。 节不能同时出现在位置标记外部和<位置 path=“.”>标记中的同一文件中。这被视为无效配置。
若要测试节是否已锁定,请在浏览器中转到 http://localhost/app
。
如果节已锁定,浏览器会显示错误,因为应用程序级别的 web.config 文件包含该 <windowsAuthentication>
节。 这意味着 web.config 会尝试为其级别替换 <windowsAuthentication>
。 但是,由于该节现在在全局级别被锁定,因此 web.config 文件中的配置无效。
将位置标记更改为具有 overrideMode=“Deny”。 这会再次锁定相应节。 试验其他部分,例如 machine.config 或 root web.config 中的 ASP.NET 节。尝试在全局级别锁定它们,并在 web.config 级别替换它们。
任务 2:锁定特定元素和属性
在上一个任务的基础上,找到 <windowsAuthentication>
标记内的 <location>
节。 将相应位置标记设置为解锁该节:overrideMode=“Allow”。 我们只会不锁定该节的特定部分。
将“已启用”属性设置为 true,然后通过设置 lockAttributes=“enabled”将其锁定。
这可以防止应用程序级配置文件更改 <windowsAuthentication>
节的“已启用”属性的值。
如果要锁定其他属性,请将它们添加到用逗号分隔的 lockAttributes 值,如以下示例所示:
lockAttributes="enabled,attribute1,attribute2"
还可以使用“*”锁定所有属性,如以下示例所示:
lockAttributes="*"
该节现在看起来应如下所示:
<location path="." overrideMode="Allow"> <system.webServer>
<security>
<authentication>
<windowsAuthentication enabled="true" lockAttributes="enabled">
<providers>
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
</authentication>
</security>
</system.webServer>
</location>
在应用程序的 web.config 文件中,尝试替换 <windowsAuthentication>
节中的设置。
在浏览器中,请求页面以验证是否可以替换除锁定的其他所有设置,在本例中为“已启用”属性。
注意
只需在 Web.config 文件中指定属性就会导致配置失败,即使在 Web.config 文件中设置的属性的值与 ApplicationHost.config 文件中的值相同。 将锁定属性设置为任何值将被视为尝试替换该属性,因此会失败。 (另请注意,属性不同于元素,在下一个任务中,你将锁定元素。)
删除 lockAttributes 属性。
设置 lockElements=“providers”以锁定相应节中的 <providers>
元素。
如果有其他要锁定的元素,可以添加用逗号分隔的元素,如下所示:
lockElements="providers,element1,element2"
该节现在看起来应如下所示:
<location path="." overrideMode="Allow"> <system.webServer>
<security>
<authentication>
<windowsAuthentication enabled="true" lockElements="providers">
<providers>
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
</authentication>
</security>
</system.webServer>
</location>
在应用程序 Web.config 文件中,通过设置元素或尝试添加到、从中删除或清除集合来替换 <providers>
元素。
在浏览器中,请求页面并注意显示的错误。 在 web.config 文件中,替换其他元素或属性,例如“已启用”属性。 浏览到相应页面,注意不会显示任何错误。
删除 lockElements 属性。
任务 3:锁定除特定属性之外的所有内容
在此任务中,你将了解如何锁定节中的所有元素或属性,但定义的特定元素或属性除外。 在不确定节具有或将来会具有哪些属性,并且你想要锁定除显式设置为解锁的属性以外的所有属性时,这非常有用。
在上一个任务的基础上,找到位置标记内的 <windowsAuthentication>
节。
将 lockAllElementsExcept 或 lockAllAttributesExcept 属性设置为要锁定的元素或属性的逗号分隔列表。 例如,该节可能如下所示:
<windowsAuthentication enabled="true" lockAllElementsExcept="providers">
<providers>
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
或看起来像这样:
<windowsAuthentication enabled="true" lockAllAttributesExcept="enabled">
<providers>
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
在此特定节中,目前没有其他属性或元素。 如果要测试设置 lockAllElementsExcept 或 lockAllAttributesExcept 属性的效果,请将相同的属性添加到具有更丰富属性集的其他节。
任务 4:锁定某些集合指令
在此任务中,你将了解如何锁定集合上的 <add>
和 <remove>
指令,以便在应用程序级别添加配置文件元素,但不能删除。
在上一个任务的基础上,找到位置标记内的 <windowsAuthentication>
节。
设置 <providers>
集合中的 lockElements 属性以执行删除、清除操作。
完成后,该节如下所示:
<windowsAuthentication enabled="true" >
<providers lockElements="remove,clear">
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
在应用程序的 web.config 文件中,创建从集合中删除 NTLM 元素的 <remove>
元素。
完成后,web.config 文件如下所示:
<configuration>
<system.webServer>
<security>
<authentication>
<windowsAuthentication>
<providers>
<remove value="NTLM" />
</providers>
</windowsAuthentication>
</authentication>
</security>
</system.webServer>
</configuration>
在浏览器中,请求 http://localhost/app
。
任务 5:锁定集合中的特定元素
在此任务中,你将了解如何锁定特定的集合元素。 开发人员仍可以在层次结构的较低(应用程序)级别将元素添加到集合中,并且它们仍然可以从集合中删除非锁定的元素。 但是,它们无法删除你专门锁定的元素。 无法清除集合,因为清除意味着从集合中删除所有元素。
在上一个任务的基础上,找到位置标记内的 <windowsAuthentication>
节。
在 <providers>
集合中,在 NTLM 提供程序的 <add>
元素中,将 lockItem 设置为“true”。
完成后,该节如下所示:
<windowsAuthentication enabled="true" >
<providers>
<add value="Negotiate" />
<add value="NTLM" lockItem="true" />
</providers>
</windowsAuthentication>
在应用程序的 web.config 文件中,创建从集合中删除 NTLM 元素的 <remove>
元素。
完成后,web.config 文件如下所示:
<configuration>
<system.webServer>
<security>
<authentication>
<windowsAuthentication>
<providers>
<remove value="NTLM" />
</providers>
</windowsAuthentication>
</authentication>
</security>
</system.webServer>
</configuration>
在浏览器中,请求 http://localhost/app
-- 请求失败。
总结
本文档介绍了如何锁定配置设置。 可以使用 <location>
元素或通过将标记的 lockItem 属性设置为 true 来锁定整个节。 如果使用集合元素上的 lockAttributes、lockElements、lockAllAttributesExcept、lockAllElementsExcept 或 lockItem 设置,以及使用集合上的 lockElements 设置来指定特定集合指令(<add>
、<remove>
或 <clear>
),锁定功能会更灵活和精细。 锁定可能发生在层次结构的任何级别,而不仅仅是 ApplicationHost.config 中。锁定将从该级别向下生效。