ASP.NET中实现文件的保护性下载基础篇(3)

  建立这个表项后,我们的映射表将如图5所示。注意在这个表中的所有其他扩展名例如VBPROJ、CONFIG等等,aspnet_isapi.dll也会拦截这些扩展名以便进行保护。这就是当企图浏览web.config文件时会被重定向到一个拒绝页面的原因。

  在IIS中创建这个表项之后,如果尝试直接浏览我们站点上的ZIP文件的时候,如果用户没有通过身份验证的话,IIS会将其重定向到登录页面。所以,现在我们已经能够防止匿名用户下载我们的文件了,不过,一旦通过了站点的身份验证,这种保护就形同虚设了。

内容导航

  八、更加具体的保护措施

  我们的目标是,让授权用户能够浏览一个包含了已经购买的软件的页面,并且通过单击其中的链接就可以下载特定的商品。列出产品时,可以使用表结构,但是如何来保护链接呢? 之前我们介绍的方法只是防止匿名用户下载压缩文件,但是现在我们要防止授权用户直接浏览压缩文件。为此,我们需要编写一个定制的处理程序。

  定制的HTTP处理程序是实现了IHttpHandler接口的类。这个接口定义了一个称为ProcessRequest的方法,以及一个Boolean类型的名为IsReusable的属性。该属性决定了其它请求是否能够利用同一个处理程序,所以这里简单返回一个真值。这个方法将会收到一个HttpContext类型的参数。这变量为我们提供了访问该请求整个上下文的权限,包括请求中的信息和订制另一个方向上的请求的方法。

  现在,我们要创建一个称为FileDenialHandler的处理程序,它的作用是停止一个请求,并将用户重定向到一个页面来通知他们访问被拒绝。当这个处理程序取得该请求的时候,就会调用ProcessRequest方法并且执行重定向。



Code highlighting produced by Actipro CodeHighlighter (freeware)


publicvoid ProcessRequest(HttpContext context)
   {
   context.Response.Redirect(
      
"~/Downloads/Files/AccessDenied.aspx");
   }

  如您所见,这个页面位于根目录的Downloads/Files文件夹中,完整的FileDenialHandler.cs处理程序如下所示:



Code highlighting produced by Actipro CodeHighlighter (freeware)


using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
namespace DotNetDude.Web.UI
{
  
publicclass FileDenialHandler : IHttpHandler
   {
      
publicvoid ProcessRequest(HttpContext context)
      {
         context.Response.Redirect(
            
"~/Downloads/Files/AccessDenied.aspx");
      }

      
publicbool IsReusable
      {
        
get
         {
            
returntrue;
         }
      }
   }
}

  现在,这个FileDenialHandler类什么也没做,所以必须将其写入站点。为了这样,我们将其放入web.config文件的中。

  文件web.config列出了配置部分的所有特殊处理程序,并为其规定了相应的信息,包括实例化这个处理程序的谓词,匹配要让这个处理程序来处理的文件的通配符路径,以及用于该定制的处理程序的类型定义。在这个例子中,添加的配置部分如下所示:



Code highlighting produced by Actipro CodeHighlighter (freeware)


   <httpHandlers>
  
<add verb="*" path="*.zip"
   type
="DotNetDude.Web.UI.
   FileProtectionHandler,
   DotNetDude.HttpHandlers"
/>
  
</httpHandlers>

  参数type是标准的.NET完全限定名写法,并通过逗号组合了一个组件程序集名称。在实际的Web项目中编写处理程序的时候,可以省去程序集名称。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjjdzp.html