如何在 IIS 7.0 中使用配置委派

作者:Saad Ladki

摘要

本文介绍如何在服务器上启用委派配置。 本文讨论如何为服务器和应用程序部署配置设置,以及内容页和应用程序代码。

一旦计算机管理员在主配置文件 %windir%\system32\inetsrv\config\applicationHost.config 中定义了供您使用的应用程序或虚拟目录,并允许了委派特定的节,您就可以在应用程序级别控制设置:通过在应用程序的 Web.config 文件中进行设置,您可以覆盖全局默认值。 即使你不是计算机上的本地管理员,也可以访问应用程序的目录。

阅读本文档后,你将了解如何在全局级别定义应用程序和虚拟目录、解锁委派的配置部分,以及如何在配置层次结构的较低级别覆盖各个应用程序的配置设置。

介绍

IIS 允许计算机管理员将设置和更改配置的任务委托给站点和应用程序所有者。 为此,请使用内容目录中的 web.config 文件。 这些文件指定在层次结构和向下级别上生效的配置节。 计算机管理员必须在全局级别显式解锁分区才能启用此类委派。 默认情况下,大多数 IIS 部分已锁定进行委派,并且所有 .NET Framework 框架部分(包括 ASP.NET)均未在全局级别锁定。

本文档介绍如何在全局级别定义新的应用程序和虚拟目录(只有计算机管理员可以执行此任务;此任务永远无法委派)。

然后,本文档将介绍如何使用 xcopy-deploy 来处理 web.config 以及应用程序内容,以覆盖特定级别的某些设置。 它还介绍了配置系统的核心概念,介绍了如何通过直接编辑配置文件来执行这些任务,而无需在配置系统上使用 UI 或其他抽象。

先决条件

  • 请确保计算机上安装 IIS 7.0 或更高版本。 从 IE 转到 http://localhost/,将看到查看默认的“正在构造”页打开。 如果未安装 IIS,请参阅“安装操作说明”以获取安装说明。
  • 请确保您在计算机上具有管理权限。 默认情况下,如果你以内置管理员帐户以外的用户身份登录,则没有管理权限,即使你的用户身份已被添加到计算机上的本地管理员组。 这是 Windows Server® 2008 中的一项新的安全功能,称为 LUA,该功能超出了 IIS 的范围。 使用“runas”命令行工具以内置管理员帐户身份登录,或根据需要以内置管理员身份显式调用应用程序:

例如,若要启动 notepad.exe,请运行此命令:"runas /user:administrator notepad.exe"。 系统会提示输入管理员帐户的密码。 通过运行“runas /user:administrator cmd.exe”,拥有已提升的 cmd-box shell 非常有用。 从该 cmd-box 运行的每个应用程序也会被提升,并且不需要使用该 cmd-box 中的“runas”语法。

  • 确保备份主配置文件。 只需将 applicationHost.config 复制到其他文件,以便稍后可以还原它。 你将在 inetsrv\ 目录下找到 applicationHost.config,后者又位于系统目录下。

注意

你必须是管理员才能执行此操作 - 请参阅上面的要点内容。

  • 在开始之前,请确保自己处于“干净状态”。 为此,请还原之前练习中对 applicationHost.config 文件所做的更改。 (如果使用 VPC 映像,执行该操作最简单的方法是重启映像而不保存其状态)。
  • 建议在 IE(“工具”>“选项”>“高级”)中关闭友好的 HTTP 错误消息,以便更快地进行故障排除。

步骤 1:定义新应用程序

  1. 使用文本编辑器(如记事本)在以下位置打开 ApplicationHost.config 文件:

    %windir%\system32\inetsrv\config\applicationHost.config
    
  2. 导航到类似于以下内容的 <sites> 部分:

    <sites>
        <siteDefaults>
            <logFile directory="C:\WINDOWS\System32\LogFiles" />
        </siteDefaults>
         <applicationDefaults applicationPool="DefaultAppPool"/>
         <site name="Default Web Site" id="1">
            <bindings>
              <binding protocol="http" bindingInformation="*:80:" />
            </bindings>
                    <application path="/">
              <virtualDirectory path="/" physicalPath="C:\inetpub\wwwroot" />
            </application>
             <logFile directory="C:\WINDOWS\System32\LogFiles" />
        </site>
    </sites>
    
  3. 验证 Web 服务器是否正在运行,以及是否可以访问默认网站。 为此,请启动浏览器并请求 http://localhost/

  4. 请求应返回一个网页。 如果没有,请从命令框中键入“net start w3svc”来启动 IIS 服务器,或使用 Windows 事件日志查看器进行故障排除。

  5. 在浏览器中,请求 http://localhost/

    此请求不会返回页面(你看到错误页),因为配置中尚未定义虚拟路径,将在下一过程中定义。

  6. 在 ApplicationHost.config 文件中,添加一个包含 "/app" 路径的 <application> 元素,后者包含一个顶级 <virtualDirectory> 元素。 顶级虚拟目录是路径为“/”的虚拟目录。 对于虚拟目录的物理路径,请指定 C:\tmp(或稍后要使用的类似内容)。

    完成后,<sites> 部分应如下所示:

    <sites>
        <siteDefaults>
            <logFile directory="C:\WINDOWS\System32\LogFiles" />
        </siteDefaults>
         <applicationDefaults applicationPool="DefaultAppPool"/>
         <site name="Default Web Site" id="1">
           <bindings>
             <binding protocol="http" bindingInformation="*:80:" />
           </bindings>
                   <application path="/">
             <virtualDirectory path="/" physicalPath="C:\inetpub\wwwroot" />
           </application>
           <application path="/app" >
            <virtualDirectory path="/" physicalPath="C:\tmp" />
          </application>
            <logFile directory="C:\WINDOWS\System32\LogFiles" />
        </site>
    </sites>
    

    你刚刚在配置文件中定义了一个新应用程序。

  7. 在浏览器中,请求 http://localhost/

    Web 服务器返回错误页,指出未启用目录浏览。 发生这种情况是因为您在 c:\tmp 中还没有内容,所以服务器将请求作为浏览目录的请求来处理。 将 iisstart.htm 从 \inetpub\wwwroot 目录复制到 c:\tmp,然后刷新浏览器。 现在,你将看到“正在构造”页。

步骤 2:解锁配置部分

  1. 使用文本编辑器(如记事本),打开 applicationHost.config 并找到 <authentication> 节组。

  2. 将 <anonymousAuthentication> 和 <windowsAuthentication> 节从文件中的当前位置移动到文件底部的一个新位置标记中,其中包含 overrideMode="Allow",如下所示:

    <configuration>
      <system.webServer>
        <security>
          <authentication>
           <!-- cut the anonymousAuthentication and windowsAuthentication -->
           <!-- XML elements from this area in the file, and paste below  -->
          </authentication>
        </security>
      </system.webServer>
       <location overrideMode="Allow">
        <system.webServer>
          <security>
            <authentication>
              <!-- paste the 2 sections from above here -->
            </authentication>
          </security>
        </system.webServer>
      </location>
    </configuration>
    

    这些节现在可通过命名空间的较低级别进行重写,因为它们位于指定 overrideMode="Allow" 的位置标记中。 所有较低级别的 web.config 文件现在都可以覆盖这些设置。

步骤 3:在应用程序级别覆盖设置

  1. 使用记事本等文本编辑器,在应用程序文件夹(例如 c:\tmp)中创建一个名为 web.config 的新文本文件。

  2. 在 web.config 文件中,创建一个 <configuration> 元素和一个 <system.webServer> 元素作为其子元素。 在 <system.webServer> 元素中,创建一个 <security> 元素,后者包含 <authentication> 元素。

  3. 输入设置以禁用 Windows 身份验证和匿名身份验证方案(默认在全局级别开启)。

    完成后,web.config 文件如下所示:

    <configuration>
      <system.webServer>
        <security>
          <authentication>
            <windowsAuthentication enabled="false" />
            <anonymousAuthentication enabled="false" />
          </authentication>
        </security>
      </system.webServer>
    </configuration>
    
  4. 在浏览器中,请求 http://localhost/app

    注意

    您无权查看该页,因为你在 web.config 文件中禁用了此页面的所有身份验证方法。

  5. 在浏览器中,请求 http://localhost/ 并确认可以访问页面。 web.config 文件中的配置仅适用于应用程序级别。

  6. 在 web.config 文件中启用基本身份验证,方法是添加一个 <basicAuthentication> 元素并将其 enabled 属性设置为 true。

    完成后,web.config 文件如下所示:

    <configuration>
      <system.webServer>
        <security>
          <authentication>
            <windowsAuthentication enabled="false" />
            <anonymousAuthentication enabled="false" />
           <basicAuthentication enabled="true" />
          </authentication>
        </security>
      </system.webServer>
    </configuration>
    
  7. 再次请求 http://localhost/app。 你会看到一个错误页,指出某些配置在全局级别被锁定,Web.config 文件正在尝试重写它,因此这是一个配置错误。 要解决此问题,请允许在全局级别覆盖 <basicAuthentication> 节 (applicationHost.config),就像您对其他两个节所执行的操作。 然后刷新浏览器。

    现在系统会提示输入用户名和密码,这表示正在进行基本身份验证。

  8. 输入登录用户的用户名和密码,并注意页面显示。

    如果请求 http://localhost/,则不会要求你输入用户名和密码,因为对配置的更改仅适用于应用程序级别。

    注意

    服务器和浏览器都会缓存用户令牌。 如果想要从头开始,并且不想再看到用户名提示,请关闭浏览器并停止 IIS 工作进程(或从 Windows 命令行运行“net stop /y http”,然后运行“net start w3svc”)重新启动 IIS。

总结

本文档介绍如何在主配置文件 applicationHost.config 中定义应用程序和虚拟目录。还介绍如何部署包含特定于应用程序的配置文件(其中包含 <system.webServer> 节中的服务器设置)。 您可以在 <system.web> 节组中向 web.config 文件添加设置,如 ASP.NET 设置。

最佳做法是在 web.config 文件或应用程序的整个目录中设置访问控制列表 (ACL),以便非管理用户无法访问该文件。