欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ASP.NET中實(shí)現(xiàn)文件的保護(hù)性下載基礎(chǔ)篇

 更新時(shí)間:2011年02月15日 23:58:16   作者:  
許多時(shí)候,我們需要在因特網(wǎng)上提供文件下載服務(wù),但是又要防止未經(jīng)授權(quán)的下載,這時(shí)該怎么辦?本文將為讀者詳細(xì)介紹一種使用ASP.NET實(shí)現(xiàn)的HTTP處理程序的解決方案。
一、文件保護(hù)性下載的需求

  如果我們需要在站點(diǎn)上出售數(shù)字形式的商品,如電子書(shū)、數(shù)字油畫(huà)等,那么如何在供授權(quán)用戶正常下載的同時(shí)又阻止非授權(quán)用戶非法下載您的產(chǎn)品呢? 通過(guò)Forms身份驗(yàn)證,只能使這個(gè)問(wèn)題得到部分解決。本文中,我將講解如何防止某些用戶訪問(wèn)站點(diǎn)上的某些文件;即使這些文件能夠被這些用戶直接瀏覽。

  解決這個(gè)問(wèn)題的方法有多種,但是有些方法本身就有問(wèn)題。本文中,我們將考察軟件供應(yīng)廠商常用的一些技術(shù),然后再介紹一種新的解決方案。需要注意的是,這里介紹的是針對(duì)ASP.net站點(diǎn)的。

  二、常見(jiàn)的文件保護(hù)技術(shù)

  我們中很多人都有網(wǎng)上購(gòu)買軟件的經(jīng)驗(yàn),所以可能領(lǐng)教過(guò)用于文件下載的常見(jiàn)保護(hù)措施。下面,我們對(duì)它們進(jìn)行考察。

  壓縮文件口令保護(hù)

  這種保護(hù)方法比較簡(jiǎn)單,它不是防止您下載文件,而是防止未經(jīng)授權(quán)的人員從壓縮文件中提取文件的內(nèi)容,因?yàn)閃inZip和許多其他壓縮程序都提供了口令保護(hù)功能。然而,這種方法的缺點(diǎn)也很明顯,如果您允許某人訪問(wèn)該文件內(nèi)容,那就必須給他提供口令,之后,您卻無(wú)法阻止這個(gè)人將口令傳給其他人。實(shí)際上,如果您搜索互聯(lián)網(wǎng)的話,會(huì)發(fā)現(xiàn)各種各樣的口令遍地都是。采用這種保護(hù)措施的時(shí)候,只能指望授權(quán)用戶是有道德的人,不會(huì)將口令外傳?;蛘?,將這種保護(hù)措施提供一個(gè)層次,為每個(gè)人生成一個(gè)不同口令的壓縮文件,然后傳給他。 當(dāng)然,這需要一個(gè)文件存儲(chǔ)解決方案,因?yàn)樾枰芸刂瓢l(fā)送給用戶的文件。這導(dǎo)致第二種文件保護(hù)方法。

  電子郵件

  許多軟件供應(yīng)廠商并不會(huì)把文件張貼到它們的網(wǎng)站上,而是向購(gòu)買該軟件的用戶發(fā)送一封電子郵件,告知下載詳細(xì)信息,或者直接連同文件一塊發(fā)過(guò)去。 電子郵件可以包含文件下載鏈接,并限定該鏈接的有效時(shí)間。有時(shí)候,軟件供應(yīng)商還可以將這種這種技術(shù)跟口令保護(hù)相結(jié)合。文件一旦交到用戶手里,剩下的保護(hù)措施就靠軟件許可和注冊(cè)了。其他基于電子郵件的解決方案還有動(dòng)態(tài)生成文件名方法。

  臨時(shí)文件名

  一些軟件供應(yīng)廠商會(huì)使用GUID或者其它的秘密的命名技術(shù)生成一個(gè)難以猜測(cè)的文件名,同時(shí)還可以令文件只能在規(guī)定時(shí)間內(nèi)下載。

  三、技術(shù)分析

  雖然這些技術(shù)仍在使用,但是它們卻不能在您的站點(diǎn)上開(kāi)辟一片客戶區(qū)域,使得用戶能夠檢查他們的購(gòu)買歷史記錄,并隨時(shí)重新下載他們的軟件。依我看來(lái),提供了類似功能的站點(diǎn)能夠提供更好的用戶體驗(yàn),對(duì)軟件供應(yīng)商來(lái)說(shuō)也更容易管理——用戶購(gòu)買產(chǎn)品之后,您僅需給用戶發(fā)送一封包含許可證密鑰和他們?cè)谡军c(diǎn)上相應(yīng)客戶區(qū)域的鏈接即可。這樣的話,用戶知道可以隨時(shí)登錄和下載軟件,他們就會(huì)安心多了,即使弄丟了軟件文件也不用怕了。

  為此,我們將介紹一種結(jié)合了ASP.net的Forms身份驗(yàn)證和稱為HTTP處理程序的保護(hù)方案來(lái)提供這種良好的用戶體驗(yàn)。類System.Web.UI.Page本身就是一個(gè)HTTP處理程序,并且會(huì)注冊(cè)到您的機(jī)器的Web.config文件中。

內(nèi)容導(dǎo)航

  四、HTTP處理程序

  實(shí)際上,使用ASP.NET定制HTTP處理程序并沒(méi)有人們想象的那么復(fù)雜,下面我們用盡量容易理解的方式來(lái)討論這一主題。HTTP處理程序的應(yīng)用有很多,不過(guò)我們這里主要討論它在文件保護(hù)問(wèn)題方面的應(yīng)用。

用ASP.NET實(shí)現(xiàn)文件的保護(hù)性下載基礎(chǔ)篇

  圖1 IIS中的擴(kuò)展名映射

  下面我們將介紹什么是處理程序,及其工作原理,同時(shí)我們力爭(zhēng)做到進(jìn)行可能簡(jiǎn)單。在當(dāng)ASP.NET環(huán)境中,您請(qǐng)求一個(gè)ASPX頁(yè)面的時(shí)候,IIS會(huì)將該請(qǐng)求傳遞給相應(yīng)的DLL來(lái)進(jìn)行處理。所謂HTTP處理程序,就是處理IIS傳給它們的請(qǐng)求的那些類。當(dāng)您在機(jī)器上安裝ASP.NET的時(shí)候,會(huì)隨同向IIS添加一串表項(xiàng)(參見(jiàn)圖 1)。這些表項(xiàng)包含希望ASP.NET處理的文件的擴(kuò)展名(ASPX、ASMX等等)。當(dāng)我們請(qǐng)求一個(gè)ASPX的時(shí)候,IIS收到該請(qǐng)求后,會(huì)將其傳遞給相應(yīng)的DLL,在本例中為aspnet_isapi.dll,隨后生產(chǎn)相應(yīng)的HTTP處理程序?qū)嵗齺?lái)處理該請(qǐng)求。就ASPX頁(yè)面而論,用到的HTTP處理程序是位于System.Web.UI命名空間中的一個(gè)Page類。

  就ASPX頁(yè)面而論,頁(yè)面處理程序用來(lái)控制和觸發(fā)生命周期事件;當(dāng)您瀏覽一個(gè)ASPX頁(yè)面的時(shí)候,基本上一切工作都是由它來(lái)處理的。然而,您可以編寫(xiě)一個(gè)定制的HTTP處理程序來(lái)攔截瀏覽器發(fā)出的所有的請(qǐng)求,從而調(diào)整或者定制正常發(fā)生的動(dòng)作。為此,我們需要用到多種技術(shù),本文中我將首先討論其中的IIS表項(xiàng),以及Forms身份驗(yàn)證有關(guān)內(nèi)容。

  五、IIS與Forms身份驗(yàn)證

  前面提過(guò),IIS會(huì)把注冊(cè)的擴(kuò)展名發(fā)送到aspnet_isapi.dll。圖1展示的是找到的已注冊(cè)擴(kuò)展名。我們可以在虛擬目錄或者網(wǎng)站的“Properties”中的“Configuration”選項(xiàng)就可以看到這個(gè)對(duì)話框。帶有由aspnet_isapi.dll進(jìn)行處理的已注冊(cè)擴(kuò)展名的任何文件都受到ASP.NET的Forms身份驗(yàn)證的支配。下面我們對(duì)Forms身份驗(yàn)證的運(yùn)行機(jī)制做簡(jiǎn)單介紹。

  定制的HTTP處理程序?qū)嶋H上就是實(shí)現(xiàn)了IHttpHandler接口的那些類。Forms身份驗(yàn)證允許您防止匿名用戶在未授權(quán)的情況下訪問(wèn)某些web頁(yè)面。文件web.config利用以下代碼來(lái)設(shè)置Forms身份驗(yàn)證:



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

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

  上面的代碼會(huì)防止沒(méi)有通過(guò)身份驗(yàn)證的用戶訪問(wèn)所有的頁(yè)面。如果一個(gè)匿名用戶試圖訪問(wèn)一個(gè)網(wǎng)頁(yè),該代碼會(huì)自動(dòng)地將他們重定向到Login.aspx頁(yè)面。這樣一來(lái),站點(diǎn)開(kāi)發(fā)人員就能決定在這個(gè)頁(yè)面中使用哪種身份驗(yàn)證方法,但是在ASP.NET 2.0中,開(kāi)發(fā)人員可以很輕松地使用新的安全控件來(lái)完成此項(xiàng)工作。

  現(xiàn)在,我們說(shuō)過(guò)這個(gè)代碼能夠阻止未通過(guò)身份驗(yàn)證的用戶訪問(wèn)任何頁(yè)面,但是準(zhǔn)確來(lái)說(shuō)它是阻止了未經(jīng)認(rèn)證的用戶訪問(wèn)所有被aspnet_isapi.dll攔截的那些文件。這將在后面詳加解釋。為了給本文的后面的內(nèi)容做鋪墊,我們需要先描述示例電子商務(wù)站點(diǎn)的一些具體細(xì)節(jié)。

內(nèi)容導(dǎo)航

  六、保護(hù)措施規(guī)劃

  假設(shè)我們的站點(diǎn)使用戶能在線購(gòu)買軟件,但是在購(gòu)買或者下載軟件之前,用戶必須首先注冊(cè)。然后,分別為用戶和產(chǎn)品建立一個(gè)表,然后分別存放用戶名和產(chǎn)品序列號(hào)。當(dāng)用戶購(gòu)買軟件的時(shí)候,通過(guò)在另一個(gè)表中創(chuàng)建一個(gè)記錄來(lái)關(guān)聯(lián)用戶和產(chǎn)品。我們稱這個(gè)表為UserProducts。

  我們想把所有的軟件產(chǎn)品文件存儲(chǔ)在一個(gè)稱為files的文件夾中,該文件夾位于網(wǎng)站的根文件夾之中。產(chǎn)品表有一個(gè)字段,用于產(chǎn)品文件名,該文件名對(duì)應(yīng)于files文件夾中的一個(gè)壓縮文件。 我們稱這個(gè)字段為ProductFileName。下面我們逐步介紹如何保護(hù)這些ZIP 文件。

  七、保護(hù)所有的壓縮文件

  首先,我們要防止所有的壓縮文件被未經(jīng)驗(yàn)證的用戶所下載。我們要讓所有擴(kuò)展名為.zip的文件經(jīng)由ASP.NET 的Forms身份驗(yàn)證處理,這樣匿名用戶就不能訪問(wèn)它們了。雖然這一步并不是最關(guān)鍵的,但是它確實(shí)提供了文件的安全性。

  通常如果您能直接瀏覽某網(wǎng)站上的一個(gè)ZIP 文件,該站點(diǎn)會(huì)提示您打開(kāi)或者將該文件保存到硬盤(pán)上。我們想讓ASP.NET攔截對(duì)擴(kuò)展名為zip的文件的請(qǐng)求,所以需要在IIS的應(yīng)用程序映射表中添加相應(yīng)的擴(kuò)展名。

  為此,可以打開(kāi)IIS的管理控制臺(tái),找到相應(yīng)的站點(diǎn)或虛擬目錄,單擊右鍵并選擇“Properties”選項(xiàng),就會(huì)顯示圖 2。如果單擊“Web Site”或者“Virtual Directory”選項(xiàng)卡中的“Configuration”按鈕的話,就會(huì)看到擴(kuò)展名表和用于處理它們的DLL,見(jiàn)圖1。我們必須將擴(kuò)展名“zip”添加到這個(gè)列表中,為此,可以單擊“add”按鈕,然后再擴(kuò)展名文本框中鍵入“zip”,并單擊“Limit to verb”選項(xiàng)按鈕。

用ASP.NET實(shí)現(xiàn)文件的保護(hù)性下載基礎(chǔ)篇

圖2 網(wǎng)站屬性

用ASP.NET實(shí)現(xiàn)文件的保護(hù)性下載基礎(chǔ)篇

圖3 導(dǎo)航至aspnet_isapi.dll

內(nèi)容導(dǎo)航

  在Verbs文本框中,鍵入GET、HEAD、POST、DEBUG,以指示aspnet_isapi.dll攔截zip類型文件的請(qǐng)求。在Executable:文本框中,導(dǎo)航至aspnet_isapi.dll文件的位置,見(jiàn)圖3。這個(gè)文件位于相應(yīng)框架版本文件夾下的C:\WINDOWS\Microsoft.NET\Framework\目錄中,如圖4所示。

  用ASP.NET實(shí)現(xiàn)文件的保護(hù)性下載基礎(chǔ)篇

圖4 給IIS添加zip擴(kuò)展名映射

  用ASP.NET實(shí)現(xiàn)文件的保護(hù)性下載基礎(chǔ)篇

圖5 映射zip擴(kuò)展名

  建立這個(gè)表項(xiàng)后,我們的映射表將如圖5所示。注意在這個(gè)表中的所有其他擴(kuò)展名例如VBPROJ、CONFIG等等,aspnet_isapi.dll也會(huì)攔截這些擴(kuò)展名以便進(jìn)行保護(hù)。這就是當(dāng)企圖瀏覽web.config文件時(shí)會(huì)被重定向到一個(gè)拒絕頁(yè)面的原因。

  在IIS中創(chuàng)建這個(gè)表項(xiàng)之后,如果嘗試直接瀏覽我們站點(diǎn)上的ZIP文件的時(shí)候,如果用戶沒(méi)有通過(guò)身份驗(yàn)證的話,IIS會(huì)將其重定向到登錄頁(yè)面。所以,現(xiàn)在我們已經(jīng)能夠防止匿名用戶下載我們的文件了,不過(guò),一旦通過(guò)了站點(diǎn)的身份驗(yàn)證,這種保護(hù)就形同虛設(shè)了。

內(nèi)容導(dǎo)航

  八、更加具體的保護(hù)措施

  我們的目標(biāo)是,讓授權(quán)用戶能夠?yàn)g覽一個(gè)包含了已經(jīng)購(gòu)買的軟件的頁(yè)面,并且通過(guò)單擊其中的鏈接就可以下載特定的商品。列出產(chǎn)品時(shí),可以使用表結(jié)構(gòu),但是如何來(lái)保護(hù)鏈接呢? 之前我們介紹的方法只是防止匿名用戶下載壓縮文件,但是現(xiàn)在我們要防止授權(quán)用戶直接瀏覽壓縮文件。為此,我們需要編寫(xiě)一個(gè)定制的處理程序。

  定制的HTTP處理程序是實(shí)現(xiàn)了IHttpHandler接口的類。這個(gè)接口定義了一個(gè)稱為ProcessRequest的方法,以及一個(gè)Boolean類型的名為IsReusable的屬性。該屬性決定了其它請(qǐng)求是否能夠利用同一個(gè)處理程序,所以這里簡(jiǎn)單返回一個(gè)真值。這個(gè)方法將會(huì)收到一個(gè)HttpContext類型的參數(shù)。這變量為我們提供了訪問(wèn)該請(qǐng)求整個(gè)上下文的權(quán)限,包括請(qǐng)求中的信息和訂制另一個(gè)方向上的請(qǐng)求的方法。

  現(xiàn)在,我們要?jiǎng)?chuàng)建一個(gè)稱為FileDenialHandler的處理程序,它的作用是停止一個(gè)請(qǐng)求,并將用戶重定向到一個(gè)頁(yè)面來(lái)通知他們?cè)L問(wèn)被拒絕。當(dāng)這個(gè)處理程序取得該請(qǐng)求的時(shí)候,就會(huì)調(diào)用ProcessRequest方法并且執(zhí)行重定向。



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

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

  如您所見(jiàn),這個(gè)頁(yè)面位于根目錄的Downloads/Files文件夾中,完整的FileDenialHandler.cs處理程序如下所示:



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

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

      
public bool IsReusable
      {
        
get
         {
            
return true;
         }
      }
   }
}

  現(xiàn)在,這個(gè)FileDenialHandler類什么也沒(méi)做,所以必須將其寫(xiě)入站點(diǎn)。為了這樣,我們將其放入web.config文件的中。

  文件web.config列出了配置部分的所有特殊處理程序,并為其規(guī)定了相應(yīng)的信息,包括實(shí)例化這個(gè)處理程序的謂詞,匹配要讓這個(gè)處理程序來(lái)處理的文件的通配符路徑,以及用于該定制的處理程序的類型定義。在這個(gè)例子中,添加的配置部分如下所示:



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

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

  參數(shù)type是標(biāo)準(zhǔn)的.NET完全限定名寫(xiě)法,并通過(guò)逗號(hào)組合了一個(gè)組件程序集名稱。在實(shí)際的Web項(xiàng)目中編寫(xiě)處理程序的時(shí)候,可以省去程序集名稱。

  現(xiàn)在這個(gè)條目將所有的壓縮文件請(qǐng)求轉(zhuǎn)發(fā)給新的處理程序,因此立即將請(qǐng)求重定向到“Access Denied”頁(yè)面。即使在本例中跳過(guò)該IIS條目,它仍然會(huì)照常工作,因?yàn)檫@些事情都交由我們的處理程序了。 然而,我們想要的效果是讓系統(tǒng)在判定匿名用戶訪問(wèn)非法的ZIP 文件之前,首先把他們導(dǎo)航至登錄頁(yè)面。

  如果檢查框架目錄中的web.config文件,就會(huì)發(fā)現(xiàn)一列處理常見(jiàn)文件擴(kuò)展名用于ASP.NET的處理程序。定義這個(gè)文件中的部分的處理程序決定了IIS如何恰當(dāng)?shù)剞D(zhuǎn)發(fā)ASPX頁(yè)面、ASMX Web 服務(wù)以及所有其他文件。 這個(gè)處理程序列表還定義了哪些文件擴(kuò)展名是禁用的,例如*.config。事實(shí)上,可以利用一個(gè)稱為HttpForbiddenHandler的處理程序來(lái)禁用所有以擴(kuò)展名.config結(jié)尾的文件,并自動(dòng)顯示一個(gè)“HTTP 403error Forbidden :Access is denied ”頁(yè)面。

  所以您可能問(wèn),無(wú)什么不只用Microsoft提供的處理程序來(lái)處理壓縮文件呢? 答案是,當(dāng)然可以用,不過(guò)我們需要自己的“access denied”頁(yè)面,這樣通過(guò)定制我們自己的拒絕頁(yè)面,就能跟我們的網(wǎng)站風(fēng)格保持一致。在某些情況下,我們還想為用戶提供更多的信息,甚至向管理員發(fā)送“未經(jīng)授權(quán)的嘗試”類電子郵件。

  這里只是防止下載所有的壓縮文件,但是我們實(shí)際想要做的是什么?對(duì)了,我們要取得從我們站點(diǎn)上文件下載方式的絕對(duì)控制權(quán)。我們不想讓用戶直接瀏覽壓縮文件。通過(guò)表結(jié)構(gòu),我們可建立一個(gè)項(xiàng)目、用戶列表,以及每個(gè)用戶購(gòu)買產(chǎn)品的關(guān)系表。因此如果我們有一個(gè)用戶名和一個(gè)產(chǎn)品序列號(hào),就可以通過(guò)一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)查詢來(lái)判斷這個(gè)用戶是否購(gòu)買了這個(gè)產(chǎn)品。同時(shí),我們還想讓用戶只需單擊一個(gè)鏈接就能啟動(dòng)查詢并確定是否被允許下載文件。 這些功能的確非常令人向往。

內(nèi)容導(dǎo)航

  九、控制下載

  下面,我們開(kāi)始講述如何編寫(xiě)一個(gè)用于某些文件請(qǐng)求的處理程序,以及該處理程序的安裝方法。我們的處理程序的功能很簡(jiǎn)單,它只是將請(qǐng)求重定向到其他地方而已。ASP.NET還提供了另外一種文件擴(kuò)展名即ASHX,它無(wú)需安裝到web.config文件中。我們可以創(chuàng)建一個(gè)以這個(gè)擴(kuò)展名結(jié)尾的類,來(lái)實(shí)現(xiàn)IHttpHandler接口,并就直接導(dǎo)航至該類。實(shí)際上它與一個(gè)頁(yè)面非常類似,只是它不會(huì)使用Web表單和Code-Behind類,所以它是一種更加簡(jiǎn)潔的方案。

  現(xiàn)在,我們創(chuàng)建一個(gè)新的處理程序稱為Download.ashx,并讓用戶瀏覽到該處理程序的位置,同時(shí)在QueryString參數(shù)中規(guī)定一些信息。下面的URL就是下載鏈接:

  ~/Downloads/Download.ashx?Product=101

  這個(gè)URL表示下載與產(chǎn)品101有關(guān)的文件。用戶或者鏈接可以訪問(wèn)上述URL來(lái)試圖下載一個(gè)文件,這時(shí),該處理程序的ProcessRequest方法就會(huì)執(zhí)行。

  利用標(biāo)準(zhǔn)Forms身份驗(yàn)證對(duì)用戶身份進(jìn)行驗(yàn)證,這樣就能訪問(wèn)在我們站點(diǎn)上下文中的User對(duì)象。請(qǐng)記住,HTTP上下文會(huì)傳遞給該處理程序的ProcessRequest方法,所以能訪問(wèn)到所需的內(nèi)容。對(duì)象User允許我們獲得使用User.Identity.Name的授權(quán)用戶的名稱,還有,我們還可以使用該方法訪問(wèn)User表中的用戶。訪問(wèn)用戶的名稱,我們要使用User.Identity.IsAuthenticated的值來(lái)檢查他們是否已經(jīng)過(guò)身份認(rèn)證,如果沒(méi)有,將其重定向到“access denied”。此外,我們還要訪問(wèn)請(qǐng)求的產(chǎn)品號(hào)碼,代碼如下所示:



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

context.Request.QueryString["Product"]

  這樣,我們就取得了產(chǎn)品號(hào)碼和用戶名。 有了這兩者,我們就可以訪問(wèn)UserProducts表并確定這個(gè)用戶是否購(gòu)買過(guò)這個(gè)產(chǎn)品。此外,這個(gè)表還存儲(chǔ)有該產(chǎn)品的文件名。

  既然有了用戶名和產(chǎn)品號(hào)碼,并通過(guò)它們確定除了用戶購(gòu)買情況。如果該用戶沒(méi)有購(gòu)買相應(yīng)的產(chǎn)品,我們就將其重定向到前面的處理程序,并返回一個(gè)訪問(wèn)拒絕頁(yè)面。為簡(jiǎn)潔起見(jiàn),我們將其重定向到一個(gè)告知他們還沒(méi)有購(gòu)買過(guò)此產(chǎn)品的頁(yè)面,并告知如何進(jìn)行購(gòu)買。

  如果確定該用戶購(gòu)買了這個(gè)產(chǎn)品,可以通過(guò)ProductFileName字段了解該用戶可以查看哪些文件。這里,我們沒(méi)有存儲(chǔ)完整的路徑,只是存儲(chǔ)了文件名。如果需要,我們可以從web.config中的設(shè)置來(lái)獲得該文件夾,所以最終獲得了完整的文件路徑和名稱,并授權(quán)下載。 下面我們通過(guò)稱為StartDownload方法來(lái)完成此任務(wù):



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

private void StartDownload(
       HttpContext context,
string downloadFile)
   {
         context.Response.Buffer
= true;
         context.Response.Clear();
         context.Response.AddHeader(
            
"content-disposition",
            
"attachment; filename=" + downloadFile);
         context.Response.ContentType
=
            
"application/zip";
         context.Response.WriteFile(
            
"~/Downloads/Files/" + downloadFile);
   }

  這里的ProcessRequest方法會(huì)調(diào)用StartDownload方法,完整的Download.ashx代碼如下所示:



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

<%@ WebHandler Language="C#" Class="Download" %>
using System;
using System.Web;
public class Download : IHttpHandler
{
  
public void ProcessRequest (HttpContext context)
   {
      
if (context.User.Identity.IsAuthenticated)
      {
        
if(context.Request.QueryString["Product"] != null
            
&& context.Request.QueryString["Product"] != "")
         {
            
int productID = Convert.ToInt16(
               context.Request.QueryString[
"Product"]);
            
string userName = context.User.Identity.Name;
            UserProduct product
= UserProductFactory.GetProductByUser(
               userName, productID);
            
if(product != null)
               StartDownload(product.FileName);
            
else
               context.Response.Redirect(
                  
"~/Downloads/Files/AccessDenied.aspx");
         }
      }
   }

  
public bool IsReusable
   {
      
get
      {
        
return false;
      }
   }
  
private void StartDownload(string downloadFile)
   {
      context.Response.Buffer
= true;
      context.Response.Clear();
      context.Response.AddHeader(
        
"content-disposition",
        
"attachment; filename=" + downloadFile);
      context.Response.ContentType
= "application/zip";
      context.Response.WriteFile(
        
"~/Downloads/Files/" + downloadFile);
   }
}

  這個(gè)方法會(huì)收到文件的名稱以及HttpContext。由此處,我們將清空響應(yīng)緩沖區(qū),設(shè)置一個(gè)新的頭部,然后設(shè)置內(nèi)容類型。最后,使用WriteFile方法輸出該文件,最終用戶會(huì)收到一個(gè)文件保存或打開(kāi)窗口。

  注意,使用WriteFile會(huì)輸出ZIP 文件,而是要Response.Redirect則會(huì)把用戶重定向到訪問(wèn)拒絕頁(yè)面。使用這種技術(shù)的時(shí)候,聰明的用戶可以繞過(guò)安全檢查而直接導(dǎo)航至Download.ashx文件。但即使它們?cè)O(shè)法直接瀏覽到ZIP 文件,也會(huì)被FileDenialHandler處理程序重定向到訪問(wèn)拒絕頁(yè)面。

  注意這兩種類型處理程序的區(qū)別,一個(gè)是可以放在外部組件中的標(biāo)準(zhǔn)C#(或者VB.NET)類,如果您需要編寫(xiě)可重用的處理程序的時(shí)候,這種類型比較理想,因?yàn)槟梢园阉鼈兙幾g成一個(gè)動(dòng)態(tài)鏈接庫(kù),并在不同的站點(diǎn)之間分享。當(dāng)然,我們需要在web.config文件中對(duì)它們進(jìn)行注冊(cè)。對(duì)于ASHX類型的處理程序,可以像ASPX頁(yè)面一樣添加到站點(diǎn)中。事實(shí)上,我們可以使用其他技術(shù)來(lái)完成類似Download.ASHX的功能,但是ASHX處理程序是更加簡(jiǎn)潔的解決方案。

  十、小結(jié)

  使用ASP.NET保護(hù)文件下載的所有方法中,利用HTTP處理程序是最重要的一種。通過(guò)與其他技術(shù)相結(jié)合,我們不僅能夠防止非授權(quán)用戶下載文件,還能在處理用戶下載文件試圖時(shí)獲得絕對(duì)控制權(quán),希望本文的內(nèi)容對(duì)您能夠有所幫助。

相關(guān)文章

最新評(píng)論