答案:一、文件保护性下载的需求如果我们需要在站点上出售数字形式的商品,如电子书、数字油画等,那么如何在供授权用户正常下载的同时又阻止非授权用户非法下载您的产品呢? 通过Forms身份验证,只能使这个问题得到部分解决。本文中,我将讲解如何防止某些用户访问站点上的某些文件;即使这些文件能够被这些用户直接浏览。
解决这个问题的方法有多种,但是有些方法本身就有问题。本文中,我们将考察软件供应厂商常用的一些技术,然后再介绍一种新的解决方案。需要注意的是,这里介绍的是针对ASP.net站点的。
二、常见的文件保护技术
我们中很多人都有网上购买软件的经验,所以可能领教过用于文件下载的常见保护措施。下面,我们对它们进行考察。
压缩文件口令保护
这种保护方法比较简单,它不是防止您下载文件,而是防止未经授权的人员从压缩文件中提取文件的内容,因为WinZip和许多其他压缩程序都提供了口令保护功能。然而,这种方法的缺点也很明显,如果您允许某人访问该文件内容,那就必须给他提供口令,之后,您却无法阻止这个人将口令传给其他人。实际上,如果您搜索互联网的话,会发现各种各样的口令遍地都是。采用这种保护措施的时候,只能指望授权用户是有道德的人,不会将口令外传。或者,将这种保护措施提供一个层次,为每个人生成一个不同口令的压缩文件,然后传给他。 当然,这需要一个文件存储解决方案,因为需要能控制发送给用户的文件。这导致第二种文件保护方法。
电子邮件
许多软件供应厂商并不会把文件张贴到它们的网站上,而是向购买该软件的用户发送一封电子邮件,告知下载详细信息,或者直接连同文件一块发过去。 电子邮件可以包含文件下载链接,并限定该链接的有效时间。有时候,软件供应商还可以将这种这种技术跟口令保护相结合。文件一旦交到用户手里,剩下的保护措施就靠软件许可和注册了。其他基于电子邮件的解决方案还有动态生成文件名方法。
临时文件名
一些软件供应厂商会使用GUID或者其它的秘密的命名技术生成一个难以猜测的文件名,同时还可以令文件只能在规定时间内下载。
三、技术分析
虽然这些技术仍在使用,但是它们却不能在您的站点上开辟一片客户区域,使得用户能够检查他们的购买历史记录,并随时重新下载他们的软件。依我看来,提供了类似功能的站点能够提供更好的用户体验,对软件供应商来说也更容易管理——用户购买产品之后,您仅需给用户发送一封包含许可证密钥和他们在站点上相应客户区域的链接即可。这样的话,用户知道可以随时登录和下载软件,他们就会安心多了,即使弄丢了软件文件也不用怕了。
为此,我们将介绍一种结合了ASP.net的Forms身份验证和称为HTTP处理程序的保护方案来提供这种良好的用户体验。类System.Web.UI.Page本身就是一个HTTP处理程序,并且会注册到您的机器的Web.config文件中。
内容导航四、HTTP处理程序
实际上,使用ASP.NET定制HTTP处理程序并没有人们想象的那么复杂,下面我们用尽量容易理解的方式来讨论这一主题。HTTP处理程序的应用有很多,不过我们这里主要讨论它在文件保护问题方面的应用。
图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>上面的代码会防止没有通过身份验证的用户访问所有的页面。如果一个匿名用户试图访问一个网页,该代码会自动地将他们重定向到Login.aspx页面。这样一来,站点开发人员就能决定在这个页面中使用哪种身份验证方法,但是在ASP.NET 2.0中,开发人员可以很轻松地使用新的安全控件来完成此项工作。
现在,我们说过这个代码能够阻止未通过身份验证的用户访问任何页面,但是准确来说它是阻止了未经认证的用户访问所有被aspnet_isapi.dll拦截的那些文件。这将在后面详加解释。为了给本文的后面的内容做铺垫,我们需要先描述示例电子商务站点的一些具体细节。
内容导航六、保护措施规划
假设我们的站点使用户能在线购买软件,但是在购买或者下载软件之前,用户必须首先注册。然后,分别为用户和产品建立一个表,然后分别存放用户名和产品序列号。当用户购买软件的时候,通过在另一个表中创建一个记录来关联用户和产品。我们称这个表为UserProducts。
我们想把所有的软件产品文件存储在一个称为files的文件夹中,该文件夹位于网站的根文件夹之中。产品表有一个字段,用于产品文件名,该文件名对应于files文件夹中的一个压缩文件。 我们称这个字段为ProductFileName。下面我们逐步介绍如何保护这些ZIP 文件。
七、保护所有的压缩文件
首先,我们要防止所有的压缩文件被未经验证的用户所下载。我们要让所有扩展名为.zip的文件经由ASP.NET 的Forms身份验证处理,这样匿名用户就不能访问它们了。虽然这一步并不是最关键的,但是它确实提供了文件的安全性。
通常如果您能直接浏览某网站上的一个ZIP 文件,该站点会提示您打开或者将该文件保存到硬盘上。我们想让ASP.NET拦截对扩展名为zip的文件的请求,所以需要在IIS的应用程序映射表中添加相应的扩展名。
为此,可以打开IIS的管理控制台,找到相应的站点或虚拟目录,单击右键并选择“Properties”选项,就会显示图 2。如果单击“Web Site”或者“Virtual Directory”选项卡中的“Configuration”按钮的话,就会看到扩展名表和用于处理它们的DLL,见图1。我们必须将扩展名“zip”添加到这个列表中,为此,可以单击“add”按钮,然后再扩展名文本框中键入“zip”,并单击“Limit to verb”选项按钮。
图2 网站属性
使用AjaxPro.Net框架实现在客户端调用服务端的方法
下一个:ASP.Net执行cmd命令的实现代码