了解 IIS 7.0 URL 授权

作者:Saad Ladki

介绍

在 IIS 的早期版本中,授权并非易事。 由于 IIS 仅适用于 Windows 标识,因此你必须前往文件系统,在文件和目录上设置访问控制列表。 这很繁琐,因为 ACL 用户界面很复杂,不能很好地在计算机之间复制授权规则。

IIS 7.0 及更高版本使用 URL 授权。 支持将授权规则放在实际的 URL 而不是底层文件系统资源上。 此外,IIS URL 授权配置存储在 web.config 文件中 - 你可以根据应用程序内容分配授权规则。 以下演练介绍了 Windows Server® 2008 Beta 3 和 Windows Vista Service Pack 1 中的 IIS URL 授权功能。

先决条件

本演练需要在默认安装的基础上安装以下 IIS 额外功能:

  • ASP.NET:“Internet Information Services”–“万维网服务”–“应用程序开发功能”
  • URL 授权:“Internet Information Services”–“万维网服务”-“安全性”

场景

让我们模拟一个场景,其中只有 Alice、Bob 和管理员组可以访问的安全目录。 在此目录中,有一个名为 bobsSecret.aspx 的文件,只有 Bob 才能访问。

场景设置

对于此场景,我们需要三个用户:Alice、Bob 和 Fred。 我们还需要一个名为 BobAndFriends 的新组,Alice 和 Bob 是其中成员。 通过 Windows 用户管理器或启动提升的命令提示符创建三个帐户和组,然后输入以下命令

net user Alice <password_of_your_choice> /add
net user Bob <password_of_your_choice> /add
net user Fred <password_of_your_choice> /add
net localgroup BobAndFriends /add
net localgroup BobAndFriends Alice /add
net localgroup BobAndFriends Bob /add
  1. 打开资源管理器并进入 %systemdrive%\inetpub\wwwroot 目录。

  2. 创建一个名为“secure”的目录。

  3. 切换到“secure”目录并创建一个名为“default.aspx”的新文件。 可以使用记事本或任何其他文本编辑器执行此操作。

  4. 将以下代码粘贴到 default.aspx 页:

    <%@Language="C#"%>
    <%
        string currentUser = Request.ServerVariables["LOGON_USER"];
        if (currentUser == "")
            currentUser = "anonymous";
        Response.Write("<b>Current User:</b> " + currentUser);
    %>
    
  5. 再创建一个名为 bobsSecret.aspx 的文件,并将以下代码粘贴到其中:

    <%@Language="C#"%>
    <%
       string currentUser = Request.ServerVariables["LOGON_USER"];
        if (currentUser == "")
            currentUser = "anonymous";
        Response.Write("<b>Current User:</b> " + currentUser);
    Response.Write("
    <b>My secret:</b> I used Apache before I discovered IIS7.</b> ");
    %>
    
  6. 现在通过请求 http://localhost/secure/http://localhost/secure/bobsSecret.aspx 来查看这两个网页是否运作。

配置身份验证

身份验证揭示了试图执行访问的对象。 授权揭示了经过验证的对象是否确实获得了访问权限。 因此,在尝试使用 URL 授权之前,必须启用身份验证,因为在不知道执行访问的对象的情况下,我们无法回答他们是否具有访问权限。

  1. 在“开始搜索”菜单中输入 INETMGR 来启动 INETMGR。

  2. 打开左侧树状视图中的计算机节点,然后打开“默认网站”节点并选择“secure”目录。

  3. 双击“身份验证”。

  4. 请禁用“匿名身份验证”,然后启用“基本身份验证”。

  5. 现在再次请求 http://localhost/securehttp://localhost/secure/bobsSecret.aspx。 系统会提示你输入登录信息。 输入“Alice”作为用户名然后输入对应密码。 你将以“Alice”身份进行身份验证。

    注意

    如果使用 Internet Explorer,可以按 Ctrl+F5,以便 Internet Explorer 刷新 ASP.NET 页的缓存版本。

配置 URL 授权

现在保护这两个页面,以便只有 Alice 和 Bob 才有权访问:

  1. 再次双击“secure”Web 目录,然后选择“授权规则”。

  2. 删除“允许所有用户”规则。

  3. 单击“添加允许规则”,然后选择“指定的角色或用户组:”单选按钮并添加“BobAndFriends”,然后单击“确定”按钮。

    Screenshot showing Add Allow Authorization Rule panel with selection of Specified roles or user groups.

  4. 关闭所有 Internet Explorer 窗口,因为 Internet Explorer 会缓存在上一步中输入的登录信息。

  5. 打开 Internet Explorer,并尝试使用 Fred 的登录信息访问页面。 你无法访问。

  6. 现在,请尝试使用 Bob 或 Alice 的登录信息。 你可以访问。

为单个网页配置 URL 授权

现在,我们仍然有问题,Alice 仍然可以访问 BobsSecret.aspx。 修复方法如下:

  1. 再次双击“Secure”Web 目录,然后选择页面底部的“内容视图”。

  2. 你将看到安全文件夹中的文件列表,即“default.aspx”和“bobsSecret.aspx”。

  3. 右键单击 bobsSecret.aspx 并选择“功能视图”

    Screenshot showing contents of Secure web directory including default dot a s p x and bobsSecret dot a s p x.

  4. 现在,仅对状态栏中所示的 bobsSecret.aspx 页面执行更改。

  5. 再次选择“授权规则”。 画面上会出现继承的设置,即允许 BobsAndFriends 组访问 bobsSecret.aspx。

  6. 删除“BobsAndFriends”规则。

  7. 现在单击“添加允许规则…”

  8. 单击“指定用户:”单选按钮,输入“Bob”,然后单击“确定”。

    Screenshot showing Add Allow Authorization Rule panel with Specified users selected.

  9. 关闭所有 Internet Explorer 窗口并请求 http://localhost/secure/bobsSecret.aspx

  10. 只有输入 Bob 的登录信息才能获得访问权限。

URL 授权高级主题

下段内容与一些高级 URL 授权主题有关。

配置

无需使用用户界面来指定 URL 授权设置。 可以直接在 web.config 文件中指定 URL 授权规则。 默认情况下,支持委派 IIS<授权>配置部分 - 你可以将授权规则与 Web 内容一起分配。 下面,请参阅按照演练执行操作后,%systemdrive%\inetpub\wwwroot\secure\web.config 文件的样式:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
        <security> 
            <authorization> 
                <remove users="*" roles="" verbs="" /> 
        <add accessType="Allow" roles="BobAndFriends" />             

            </authorization> 
        </security> 
    </system.webServer> 
    <location path="bobsSecret.aspx"> 
        <system.webServer> 
            <security> 
                <authorization> 
                    <remove users="" roles="BobAndFriends" verbs="" /> 
                    <add accessType="Allow" users="Bob" />                  

                </authorization> 
            </security> 
        </system.webServer> 
    </location> 
</configuration>

ASP.NET URL 授权与 IIS URL 授权之间的差异

ASP.NET URL 授权和 IIS URL 授权之间存在很小但重要的差异。 这两个模块都可以通过 IIS 安装程序进行安装。 在 IIS 安装用户界面中安装“URL 授权”功能时,系统会安装 IIS URL 授权:
Screenshot of Window Features showing URL Authorization box checked.

在 IIS 上安装 ASP.NET 时,系统会安装 ASP.NET URL 授权。 如果你是 ASP.NET 专家,请记住,ASP.NET URL 授权是在 System.Web.Security.UrlAuthorizationModule 模块中实现的。 相应的配置部分是 system.web/authorization。 配置条目如下。

<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" preCondition="managedHandler" />

IIS URL 授权模块在全局模块 urlauthz.dll 中实现。

<add name="UrlAuthorizationModule" image="%windir%\System32\inetsrv\urlauthz.dll" />

请务必记住,managedHandler 先决条件位于 ASP.NET Url 授权模块上。 根据前提条件可知,仅当处理请求的代码映射到托管代码(通常是 .aspx 或 .asmx 页面)时,才会调用 URL 授权模块。 另一方面,IIS URL 授权适用于所有内容。 可以从 ASP.NET Url 授权模块中删除 managedHandler 前提条件。 当必须通过托管代码实现每个请求(例如对 .html 或 .jpg 页面的请求)时,托管代码有助于避免必要的性能损失。

规则计算

IIS 和两个 URL 授权模块评估授权规则的顺序也存在差异。 ASP.NET URL 授权以开发人员为中心,开发人员可以完全控制他们设置的规则。 IIS URL 授权会记住管理员,并尽力确保开发人员无法覆盖管理员设置的规则。

示例

假设管理员希望确保必须对特定站点的所有用户进行身份验证。 为此,请对站点根目录设置以下配置:

<authorization lockElements="clear"> 
    <add accessType="Deny" users="?" /> 
</authorization>

此配置拒绝匿名用户的访问(? = 匿名用户,* = 所有用户)。 使用 lockElements="clear",可确保较低级别的任何用户都无法清除此设置的继承。 设置将继承到此站点的所有应用程序和虚拟目录。 尝试在较低级别使用 <clear/> 语句时,会出现锁定冲突。

有关配置锁定的详细信息,请参阅“锁定 ASP.NET 配置设置的方法”。

还可以在 ASP.NET Url 授权中锁定 clear 元素。 问题在于 ASP.NET URL 授权从下到上评估授权规则,即它首先评估当前 web.config 文件中的规则,然后再评估父规则。 找到匹配项后,系统将授予或拒绝访问权限。 在上面的示例中,仍可以通过指定 <add users="?"/> 作为安全 web.config 文件中的授权规则。 由于首先对其进行评估,因此将授予匿名用户访问权限。

IIS URL 授权模块首先评估拒绝规则。 由于拒绝匿名用户的访问,因此不能直接重写该规则。 另一大区别是先评估父规则。 这意味着,如果在较高级别拒绝 Fred 的访问,则不得在较低级别允许 Fred 访问。

差异表

差异 ASP.NET URL 授权行为 IIS URL 授权行为
规则评估 顺序:a) 从较低级别开始,上升到父级 b) 规则集合中规则的出现顺序 顺序:a) 首先从父级开始评估拒绝规则 b) 从父级开始评估允许规则 c) 规则集合中规则的出现顺序
IIS 用户界面 无 IIS 用户界面 “授权规则”用户界面
配置部分 system.web/authorization .webServer/security/authorization
模块 System.Web.Security.UrlAuthorization %windir%\system32\inetsrv\urlauthz.dll
内容 仅适用于映射到托管处理程序的内容(可通过 managedHandler 前置条件关闭) 适用于所有内容

使用域帐户和组

必须使用以下内容指定域帐户和组:

<domainname or username>\<user>

此示例使用计算机名称(假设我们已在计算机 iis7test 上创建帐户):

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
        <security> 
            <authorization> 
                <remove users="*" roles="" verbs="" /> 
                <add accessType="Allow" roles="iis7test\BobAndFriends" />             

            </authorization> 
        </security> 
    </system.webServer> 
    <location path="bobsSecret.aspx"> 
        <system.webServer> 
            <security> 
                <authorization> 
                    <remove users="" roles="iis7test\BobAndFriends" verbs="" /> 
                    <add accessType="Allow" users="iis7test\Bob" />                  

                </authorization> 
            </security> 
        </system.webServer> 
    </location> 
</configuration>

使用非 Windows 标识

URL 授权不仅适用于 Windows 标识, 也适用于非 Windows 标识。 如果要编写自己的身份验证模块,请将其与 ASP.NET 成员资格和角色一起使用,并用于自定义标识。

总结

URL 授权是指定 Web 应用程序的授权规则的强大新方法。 现在可以在 XML 中指定规则,而无需再使用 Windows 访问控制列表。