日期:2010-01-21  浏览次数:20529 次

一、文件保护性下载的需求

  如果我们需要在站点上出售数字形式的商品,如电子书、数字油画等,那么如何在供授权用户正常下载的同时又阻止非授权用户非法下载您的产品呢? 通过Forms身份验证,只能使这个问题得到部分解决。本文中,我将讲解如何防止某些用户访问站点上的某些文件;即使这些文件能够被这些用户直接浏览。

  解决这个问题的方法有多种,但是有些方法本身就有问题。本文中,我们将考察软件供应厂商常用的一些技术,然后再介绍一种新的解决方案。需要注意的是,这里介绍的是针对ASP.net站点的。

  二、常见的文件保护技术

  我们中很多人都有网上购买软件的经验,所以可能领教过用于文件下载的常见保护措施。下面,我们对它们进行考察。

  压缩文件口令保护

  这种保护方法比较简单,它不是防止您下载文件,而是防止未经授权的人员从压缩文件中提取文件的内容,因为WinZip和许多其他压缩程序都提供了口令保护功能。然而,这种方法的缺点也很明显,如果您允许某人访问该文件内容,那就必须给他提供口令,之后,您却无法阻止这个人将口令传给其他人。实际上,如果您搜索互联网的话,会发现各种各样的口令遍地都是。采用这种保护措施的时候,只能指望授权用户是有道德的人,不会将口令外传。或者,将这种保护措施提供一个层次,为每个人生成一个不同口令的压缩文件,然后传给他。 当然,这需要一个文件存储解决方案,因为需要能控制发送给用户的文件。这导致第二种文件保护方法。

  电子邮件

  许多软件供应厂商并不会把文件张贴到它们的网站上,而是向购买该软件的用户发送一封电子邮件,告知下载详细信息,或者直接连同文件一块发过去。 电子邮件可以包含文件下载链接,并限定该链接的有效时间。有时候,软件供应商还可以将这种这种技术跟口令保护相结合。文件一旦交到用户手里,剩下的保护措施就靠软件许可和注册了。其他基于电子邮件的解决方案还有动态生成文件名方法。

  临时文件名

  一些软件供应厂商会使用GUID或者其它的秘密的命名技术生成一个难以猜测的文件名,同时还可以令文件只能在规定时间内下载。

  三、技术分析

  虽然这些技术仍在使用,但是它们却不能在您的站点上开辟一片客户区域,使得用户能够检查他们的购买历史记录,并随时重新下载他们的软件。依我看来,提供了类似功能的站点能够提供更好的用户体验,对软件供应商来说也更容易管理——用户购买产品之后,您仅需给用户发送一封包含许可证密钥和他们在站点上相应客户区域的链接即可。这样的话,用户知道可以随时登录和下载软件,他们就会安心多了,即使弄丢了软件文件也不用怕了。

  为此,我们将介绍一种结合了ASP.net的Forms身份验证和称为HTTP处理程序的保护方案来提供这种良好的用户体验。类System.Web.UI.Page本身就是一个HTTP处理程序,并且会注册到您的机器的Web.config文件中。

内容导航

  四、HTTP处理程序

  实际上,使用ASP.NET定制HTTP处理程序并没有人们想象的那么复杂,下面我们用尽量容易理解的方式来讨论这一主题。HTTP处理程序的应用有很多,不过我们这里主要讨论它在文件保护问题方面的应用。

用ASP.NET实现文件的保护性下载基础篇

  图1 IIS中的扩展名映射

  下面我们将介绍什么是处理程序,及其工作原理,同时我们力争做到进行可能简单。在当ASP.NET环境中,您请求一个ASPX页面的时候,IIS会将该请求传递给相应的DLL来进行处理。所谓HTTP处理程序,就是处理IIS传给它们的请求的那些类。当您在机器上安装ASP.NET的时候,会随同向IIS添加一串表项(参见图 1)。这些表项包含希望ASP.NET处理的文件的扩展名(ASPX、ASMX等等)。当我们请求一个ASPX的时候,IIS收到该请求后,会将其传递给相应的DLL,在本例中为aspnet_isapi.dll,随后生产相应的HTTP处理程序实例来处理该请求。就ASPX页面而论,用到的HTTP处理程序是位于System.Web.UI命名空间中的一个Page类。

  就ASPX页面而论,页面处理程序用来控制和触发生命周期事件;当您浏览一个ASPX页面的时候,基本上一切工作都是由它来处理的。然而,您可以编写一个定制的HTTP处理程序来拦截浏览器发出的所有的请求,从而调整或者定制正常发生的动作。为此,我们需要用到多种技术,本文中我将首先讨论其中的IIS表项,以及Forms身份验证有关内容。

  五、IIS与Forms身份验证

  前面提过,IIS会把注册的扩展名发送到aspnet_isapi.dll。图1展示的是找到的已注册扩展名。我们可以在虚拟目录或者网站的“Properties”中的“Configuration”选项就可以看到这个对话框。带有由aspnet_isapi.dll进行处理的已注册扩展名的任何文件都受到ASP.NET的Forms身份验证的支配。下面我们对Forms身份验证的运行机制做简单介绍。

  定制的HTTP处理程序实际上就是实现了IHttpHandler接口的那些类。Forms身份验证允许您防止匿名用户在未授权的情况下访问某些web页面。文件web.config利用以下代码来设置Forms身份验证:



Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

<authentication mode="Forms">
<forms loginUrl="Login.aspx"/>
</authentication>
<authorization>
<deny users="?"/>
</authorization>

  上面的代码会防止没有通过身份验证的用户访问所有的页面。如果一个匿名用户试图访问一个网页,该代码会自动地