作者: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
打开资源管理器并进入
%systemdrive%\inetpub\wwwroot
目录。创建一个名为“secure”的目录。
切换到“secure”目录并创建一个名为“default.aspx”的新文件。 可以使用记事本或任何其他文本编辑器执行此操作。
将以下代码粘贴到 default.aspx 页:
<%@Language="C#"%> <% string currentUser = Request.ServerVariables["LOGON_USER"]; if (currentUser == "") currentUser = "anonymous"; Response.Write("<b>Current User:</b> " + currentUser); %>
再创建一个名为 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> "); %>
现在通过请求
http://localhost/secure/
和http://localhost/secure/bobsSecret.aspx
来查看这两个网页是否运作。
配置身份验证
身份验证揭示了试图执行访问的对象。 授权揭示了经过验证的对象是否确实获得了访问权限。 因此,在尝试使用 URL 授权之前,必须启用身份验证,因为在不知道执行访问的对象的情况下,我们无法回答他们是否具有访问权限。
在“开始搜索”菜单中输入 INETMGR 来启动 INETMGR。
打开左侧树状视图中的计算机节点,然后打开“默认网站”节点并选择“secure”目录。
双击“身份验证”。
请禁用“匿名身份验证”,然后启用“基本身份验证”。
现在再次请求
http://localhost/secure
和http://localhost/secure/bobsSecret.aspx
。 系统会提示你输入登录信息。 输入“Alice”作为用户名然后输入对应密码。 你将以“Alice”身份进行身份验证。注意
如果使用 Internet Explorer,可以按 Ctrl+F5,以便 Internet Explorer 刷新 ASP.NET 页的缓存版本。
配置 URL 授权
现在保护这两个页面,以便只有 Alice 和 Bob 才有权访问:
再次双击“secure”Web 目录,然后选择“授权规则”。
删除“允许所有用户”规则。
单击“添加允许规则”,然后选择“指定的角色或用户组:”单选按钮并添加“BobAndFriends”,然后单击“确定”按钮。
关闭所有 Internet Explorer 窗口,因为 Internet Explorer 会缓存在上一步中输入的登录信息。
打开 Internet Explorer,并尝试使用 Fred 的登录信息访问页面。 你无法访问。
现在,请尝试使用 Bob 或 Alice 的登录信息。 你可以访问。
为单个网页配置 URL 授权
现在,我们仍然有问题,Alice 仍然可以访问 BobsSecret.aspx。 修复方法如下:
再次双击“Secure”Web 目录,然后选择页面底部的“内容视图”。
你将看到安全文件夹中的文件列表,即“default.aspx”和“bobsSecret.aspx”。
右键单击 bobsSecret.aspx 并选择“功能视图”
现在,仅对状态栏中所示的 bobsSecret.aspx 页面执行更改。
再次选择“授权规则”。 画面上会出现继承的设置,即允许 BobsAndFriends 组访问 bobsSecret.aspx。
删除“BobsAndFriends”规则。
现在单击“添加允许规则…”
单击“指定用户:”单选按钮,输入“Bob”,然后单击“确定”。
关闭所有 Internet Explorer 窗口并请求
http://localhost/secure/bobsSecret.aspx
。只有输入 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 授权:
在 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 访问控制列表。