2009-01-21 66 views
6

有誰知道爲asp.net保護媒體的好習慣嗎?asp.net媒體保護

我需要託管各種需要許可才能查看特定圖像/視頻的媒體。即特定用戶可能有或沒有權限查看媒體文件 - 而且這個事實可能會隨時改變。

我不在乎他們是否可以下載他們有權訪問的媒體文件,我只是不希望他們甚至不知道他們不應該訪問的項目。

我已經考慮過url混淆 - 這對我來說似乎很蹩腳。

我有形式認證的用戶(我不想改變這一點)。

我想保持與權限無關的媒體文件文件夾結構。

回答

11

構建一個HttpHandler,通過它可以訪問所有媒體。然後,在檢索文件並將其發送給用戶之前,您可以執行任何您需要的驗證。將所有媒體保留在主wwwroot路徑之外,或者使用權限拒絕對該文件夾的訪問。關於這一主題在這裏

更多信息:

http://www.15seconds.com/Issue/020417.htm

+0

哈哈 - 這就像用幾顆核武器練級世界貿易中心,當你可以更容易,更準確地用一些鋁熱劑... 嚴重 - 也有公共圖像 - 該技術應該只適用於特定的文件/文件夾。 – mson 2009-01-21 19:40:37

+0

嗯... k。所以,你在web.config中說的這樣的東西不會完全符合你的要求嗎? 然後,您可以使用您當前的身份驗證根據具體情況對任何匹配進行授權/保護/方案。 – Lusid 2009-01-21 21:04:29

+0

最好的部分是,您不必依靠用戶改變URL來訪問其他文件。強制處理程序要求用戶進行身份驗證,然後在數據庫中執行檢查以確定他們是否有權訪問該文件。然後,如果沒有共享登錄信息,共享網址將無法工作。 – Lusid 2009-01-21 21:07:33

0

我建議的表格,保持將每個用戶訪問的文件:

UserID int 
FileID varchar 

然後爲您的文件表:

FileID UniqueIdentifier 
FileType char(4) <- so you know which extension to use. 
etc... 

在硬盤上,將文件命名爲FileID(UniqueIdent ifier)和FileType(擴展名,例如。 .JPG)。權限表中的fileID將保存另一個表中生成的UniqueIdentifier。

你可以通過這個URL通過這個URL知道相對安全的用戶將無法猜測任何其他文件的名稱。

更新:順便說一句,這是很多比寫一個HttpHandler或處理文件權限更簡單。然而,儘管有人猜測另一個文件名的機會是無限小的,但它不是密封的安全性,因爲一個用戶可能會給另一個文件訪問權。

2

我使用XML文件中像這樣設置哪些用戶/組有權訪問文件

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE root[ 
    <!ELEMENT file ANY> 
    <!ATTLIST file name ID #REQUIRED> 
]> 
<root> 
    <file name="file.doc" users="155,321" groups="grp5" /> 
    <file name="file2.doc" users="321" groups="" /> 
</root> 

文件存儲上面的http根,使他們無法通過URL訪問。

當用戶試圖訪問GetFile.aspx?file =文件時。DOC我加載XML,得到符合

XmlNode xnFile= XML.GetElementById(wantedFile); 

,然後我調用一個函數

HasAccess(Context.User, xnFile); 

哪些檢查,如果用戶登錄和比較的權限,如果它是確定該用戶有文件,我從磁盤讀取這些文件,並將它們寫出來與

FileInfo thisFile = new FileInfo(secretLocation + wantedFile); 
Response.Clear(); 
Response.Buffer = false; 
Response.BufferOutput = false; 
Response.ClearContent(); 
Response.ClearHeaders(); 
Response.AddHeader("Content-Length", thisFile.Length.ToString()); 
Response.AddHeader("Content-disposition", "filename=" + thisFile.Name); 
Response.ContentType = "application/none"; 
Response.WriteFile(secretLocation + wantedFile); 
Response.Close(); 
Response.End(); 
Response.ClearContent(); 
Response.ClearHeaders(); 

其實現在我有一千多個文件,我想將文件數據寫入到數據庫中的XML被損壞Ť在5年內,可能是由於崩潰或同時使用。

0

brownpaperpackage.aspx?ID = {GUID}

在media.aspx的Load事件中,驗證用戶身份驗證,然後驗證用戶是否具有查看媒體的權利,如果他們這樣做,然後將媒體作爲流加載並將其作爲Spikolynn演示的頁面響應。

爲什麼這樣呢?它的代碼簡單,並且可以獲得ASP.NET和IIS身份驗證服務的所有優勢,您可以從中找到請求媒體的用戶。它微不足道的將該用戶映射到媒體對象的訪問列表。該頁面上有請求對象。您還隱藏了媒體的名稱,因此您無法從URL中知道發生了什麼。

如何防止人們直接訪問媒體?您的媒體文件不能存儲在IIS虛擬目錄中。如果是,可能會直接下載。您可以將它們作爲字節數組(blob)存儲在數據庫中,也可以將它們存儲在Web虛擬目錄之外的磁盤上。用戶必須通過ASP.NET訪問文件

如何跟蹤用戶訪問哪些媒體?你跟蹤你的用戶thorugh asp.net會員。這意味着每個用戶在aspnet_users表中都有一個ID。使用ID和文件名(或包含實際媒體的blob)爲媒體創建表格。然後你只需要創建一個連接兩者的第三個表。此表格將包含用戶標識和媒體標識,表示此用戶可以查看此媒體。與用戶ID(從asp.net成員)和媒體ID(從URL),你只需要

select count(*) from UserMedia where UserId = @UserGuid and MediaId = @MediaIdFromUrl 

如果計數> 0時,用戶可以查看媒體。

的你會如何使用URL的一個例子:

<asp:image 
    runat="server" 
    ImageUrl="brownpaperpackage.aspx?id=53a2ea4(snip)76ca8b" /> 
1

從Spikolynn您的評論回答

我疑惑 - 這怎麼不是混淆不同?經過身份驗證的用戶是否能夠與另一個經過身份驗證但未經授權的用戶共享一個圖像(他們獲得授權)?

我猜你嘗試防止未經授權的共享的媒體

這是很多公司(微軟,蘋果,IBM等)投入大量資金解決的問題。該解決方案是DRM,現在他們正在刪除它,因爲它失敗了

所以,我的回答是,如果用戶願意付出一些努力來避免它,你的不能阻止共享

你可以只保持誠實的人誠實通過應用一些技巧,如SpikolynnLusid在他們的答案解釋。