如何在 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> 节。

lockAllElementsExceptlockAllAttributesExcept 属性设置为要锁定的元素或属性的逗号分隔列表。 例如,该节可能如下所示:

<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>

在此特定节中,目前没有其他属性或元素。 如果要测试设置 lockAllElementsExceptlockAllAttributesExcept 属性的效果,请将相同的属性添加到具有更丰富属性集的其他节。

任务 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 来锁定整个节。 如果使用集合元素上的 lockAttributeslockElementslockAllAttributesExceptlockAllElementsExceptlockItem 设置,以及使用集合上的 lockElements 设置来指定特定集合指令(<add><remove><clear>),锁定功能会更灵活和精细。 锁定可能发生在层次结构的任何级别,而不仅仅是 ApplicationHost.config 中。锁定将从该级别向下生效。