使用 IIS 基本身份验证限制对 trace.axd 的访问






4.71/5 (3投票s)
2004年9月15日
3分钟阅读

68257
一种使用 IIS 基本身份验证机制来控制对 trace.axd 的访问的技术。
引言
当使用 IIS 的基本身份验证方法时,您通常会将所有受限内容放在一个文件夹中,而将所有不受限内容放在其他地方。但是,如果您需要限制对特定类型的文件或 URL 请求的访问,而该 URL 请求没有物理文件需要更改 IIS 安全设置(例如 trace.axd),而无需所有用户登录,但仍然使用 IIS 执行身份验证,该怎么办?
这可以通过编写您自己的 HttpModule
来处理所有请求,并自行执行基本身份验证来实现。然而,只需进行一些配置设置更改和少量代码,就可以更容易地实现相同的效果。
解决方案
步骤 1
第一步是将您的主应用程序设置为使用表单身份验证。
<system.web>
<authentication mode="Forms" >
<forms loginUrl = "Authentication\Login.aspx" name=".ASPNETFRM"/>
</authentication>
</system.web>
只有当特定资源被拒绝访问时,表单身份验证才会强制用户登录。由于我们没有指定授权部分,因此所有用户都可以访问所有资源。
第二步
要限制对 trace.axd 的访问权限仅限于已通过身份验证的用户,我们需要在 web.config 文件中添加一个 location 标签。
<configuration>
<location path="trace.xsd">
<authorization>
<deny users="?"/>
</authoriation>
</location>
<system.web>
...
</configuration>
步骤 3
在您网站的根目录下,创建一个名为 Authentication 的新 Web 应用程序。这是 ASP.NET 将重定向需要进行身份验证的用户的文件夹。它应该与您在步骤 1 中添加到 forms
元素中的 loginUrl
属性的第一部分匹配。
使用 IIS,更改此文件夹的安全设置,删除匿名、摘要和 Windows 身份验证,并启用基本身份验证。
步骤 4
在 Authentication 文件夹中,创建一个名为 Login.aspx 的文件。此文件名应与 loginUrl
属性的最后一部分匹配。它将包含将 Windows 身份验证映射到基于 ASP.NET 表单的应用程序的代码。
在 Login.aspx 中,复制以下代码
<%@ Page language="c#" AutoEventWireup="true"
Inherits="System.Web.UI.Page" %>
<%@ Import Namespace="System.Web.Security" %>
<%@ Import Namespace="System.Configuration" %>
<SCRIPT language=C# runat="server">
private void Page_Load(Object Src, EventArgs e )
{
string user = HttpContext.Current.User.Identity.Name;
FormsAuthenticationTicket ticket =
new FormsAuthenticationTicket( user, false, 30 );
string encTicket = FormsAuthentication.Encrypt(ticket);
Response.Cookies.Add(
new HttpCookie(
ConfigurationSettings.AppSettings["AuthCookie"],
encTicket ) );
Response.Redirect(
FormsAuthentication.GetRedirectUrl( user, false ) );
}
</SCRIPT>
当 Page Load 事件运行时,代码从 HttpContext
获取当前用户的名称。创建一个新的 FormsAuthenticationTicket
,然后将其通过 cookie 返回给用户。cookie 名称必须与在 web.config 中定义的名称相同。
将要进行身份验证的用户需要具有有效的 NTFS 权限才能访问 Authentication 文件夹和 Login.aspx 页面。您不必限制对这些文件的访问,只需确保所有用户都可以访问它们即可。
步骤 5
在 Authentication 文件夹中,创建一个新的 web.config 文件。在此文件中,我们需要添加 Login.aspx 中选择的 cookie 的应用程序设置值,并且我们需要将 ASP.NET 绑定到 IIS 身份验证,以确保 HttpContext
的 User
属性填充了针对 IIS 进行身份验证的用户的详细信息。
<configuration>
<appSettings>
<add key="AuthCookie" value=".ASPNETFRM"/>
</appSettings>
<systen.web>
<authentication mode="Windows"/>
</system.web>
</configuration>
步骤 6
最后,表单身份验证的默认行为是,Web 站点中的每个应用程序都将收到自己的用于加密 cookie 值的唯一加密密钥。因为我们需要在 Authentication 应用程序中创建的 cookie 在 Web 站点中的所有其他应用程序中都有效,所以我们需要关闭此行为。
在根应用程序的 web.config 文件中,添加额外的条目
<system.web>
<machineKey validationKey="AutoGenerate"
decryptionKey="AutoGenerate"
validation="SHA1"/>
现在,尝试访问 trace.axd 输出。如果一切设置正确,您将在数据发送回您之前被要求登录。