65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (3投票s)

2004年9月15日

3分钟阅读

viewsIcon

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 身份验证,以确保 HttpContextUser 属性填充了针对 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 输出。如果一切设置正确,您将在数据发送回您之前被要求登录。

© . All rights reserved.