2010-03-29 80 views
3

有沒有辦法創建一個受保護的下載鏈接,該鏈接是隨機的,過期的,需要密碼並指向C#中與IIS 7.0關聯的特定文件?創建受保護的鏈接

幾個隨機鏈接可以鏈接到同一個文件。

內置代碼或可能是第三方庫?

例如,http://www.example.com/<some random gibberish>/<md5 of file>/file.jpg

回答

2

一種方式做,這是使用的GUID。 GUID被設計爲不會相互碰撞,並且該設計也會導致難以猜測有效的GUID。我確信有人會告訴我這不是很安全!那麼,你也用密碼保護。在C#中生成一個GUID非常容易。

我猜你需要的是首先採用這種方式攝取要保護的文件,其次是處理器將響應給定路徑中的請求並檢查路徑中的GUID以確定它是有效。

然後,您需要一個數據庫後端來維護與URL相對應的GUID列表,密碼(最好是加密的)和到期日期。該處理程序將檢查所請求的URL/GUID的條目以查看鏈接是否已過期,然後提示用戶(可通過Web表單輕鬆完成此操作)密碼,並根據存儲在數據庫中的加密密碼進行檢查。

要生成一個GUID,你想:

System.Guid.NewGuid().ToString() 

要創建一個名爲模塊(用於IIS7)每一個請求,然後才能將條目添加到您的web.config中像這樣:

<modules> 
    <add name="MyDownloadModule" type="Example.MyDownloadModule, Example"/> 
</modules> 

其中MyDownloadModule是包含您的處理程序的類,位於名稱空間示例中。

該類那麼你需要實現IHttpModule接口內部,特別是重載方法:

public string ModuleName { 
    get { return "MyDownloadModule"; } 
} 

public void Init(HttpApplication app) { 
    // Add an event handle which is called at the beginning of each request 
    app.BeginRequest += new EventHandler(this.AppBeginRequest); 
} 

// 
// Our event handler for the BeginRequest event 
// 
private void AppBeginRequest(Object source, EventArgs e) 
{ 
    HttpRequest request = app.Context.Request; 

    // 
    // Is this a file download? 
    // 
    if (request.AppRelativeCurrentExecutionFilePath == "~/downloads") // or whatever 
    { 
      // this is where you work your GUID inspecting magic 
    } 
} 

走向看,這種方式意味着這將是呼籲向服務器發出請求,這可能不是你想要的。

0

您可以隨時創建自己的HttpHandler,然後實現自己的專有過期/驗證代碼。

喜歡的東西:

http://www.example.com/download?token={your_token} 

然後,它將是一件微不足道的小事有處理器攔截請求,並抓住從磁盤上的文件,並將其交付給客戶如果令牌查詢字符串值是正確的?

有關IHttpHandler接口的詳細信息,請參閱MSDN http://msdn.microsoft.com/en-us/library/system.web.ihttphandler.aspx