2

我有一個ASP.NET MVC應用程序,我將上傳的內容文件存儲在虛擬目錄中。這個虛擬目錄就在我的MVC網站的正下方。ASP.NET MVC網站下的虛擬目錄中的IIS內容驗證

我的問題是,虛擬目錄允許匿名訪問。任何人,無論登錄或不登錄,都可以在我的虛擬目錄中輸入一個公共URL並讀取其中的文件。是否可以配置IIS(或其他),以強制任何請求到這個虛擬目錄在允許訪問之前運行認證/授權例程?

這是不是我可以在我的網站的web.config配置,或不要求從不打任何服務器端代碼,在這種情況下?如果它從不碰到服務器端代碼(並將請求直接提供給IIS),我如何更改我的實現以要求我的站點進行身份驗證/授權,然後提供我的文件。

感謝您的幫助!

回答

3

我不知道這是可能的,你究竟是如何要求它。但是,我知道你可以用不同的方法做到這一點。也許它會爲你工作。

的想法是受保護的文件存儲,是不是可以從網絡(而不是虛擬目錄)的文件夾。然後,在處理用戶身份驗證和文件服務的控制器(如Controllers/DownloadController.cs)上有一個方法。下面是可以從c:\myfiles檢索文件的樣品的方法:

控制器/ DownloadController.cs(動作僅法):

[Authorize] 
public FileResult Download(string filename) 
{ 
    //get content type from file extension 
    var contentType = getContentTypeFromExtension(filename); 

    //return file with filename as third argument to 
    // trigger browser's download bahavior 
    return File(Path.Combine(fileFolder, filename), contentType, filename); 
} 

[Authorize] 
public FileResult Open(string filename) 
{ 
    //get content type from file extension 
    var contentType = getContentTypeFromExtension(filename); 

    //return file without download filename so that 
    // the file is opened in browser (if possible) 
    return File(Path.Combine(fileFolder, filename), contentType); 
} 

//method to get content type of file from registry using file extension 
static string getContentTypeFromExtension (string fileName) 
{ 
    string contentType = "application/unknown"; 
    string ext = System.IO.Path.GetExtension(fileName).ToLower(); 
    Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext); 
    if (regKey != null && regKey.GetValue("Content Type") != null) 
     contentType = regKey.GetValue("Content Type").ToString(); 
    return contentType; 
} 

fileFolder變量應在類級別來定義。我把它拿出來,因爲它搞亂了代碼格式。 :)

+0

有趣。我想避免使用處理程序,但這可能是我唯一的選擇。有一個問題,當返回的「文件」是圖像時,它是否會在瀏覽器中打開,就好像用戶點擊了圖像,或者是否開始下載圖像作爲下載內容一樣。我希望前者。謝謝。 – kmehta 2010-07-27 20:31:33

+0

如果您希望它像下載一樣行事,只需將第三個參數添加到返回文件(...)行。我會更新代碼來舉例。 – 2010-07-27 20:36:54

+0

謝謝!我會給這個鏡頭。 – kmehta 2010-07-27 20:42:35

0

如果您正在運行IIS 7或更高版本,具有集成的身份驗證,那麼上傳的內容將通過ASP.NET運行時中運行,因此所有正常的認證工作技巧 - 只需添加一個web.config文件夾執行一些安全性。

IIS 6或更早的版本提出了不同的挑戰。一個更好的想法是用一個HTTP處理程序「前置」文件,將它們從一個文件夾中抓取出來,以便您的文件受到運行時的保護。

+0

謝謝。我運行IIS 7和我加入此部分: <授權> < 「?」 拒絕用戶= /> <允許用戶= 「*」/> 的結果是,在認證之前,我在登錄頁面上丟失了CSS(這是一個好兆頭),但是我仍然能夠訪問VD中與web.config相同的根目錄下的內容文件。有任何想法嗎? – kmehta 2010-07-27 20:30:01

+0

VD是一個單獨的應用程序,所以它需要自己的web.config。還沒有嘗試過這種情況,所以我不確定它是否會拿起您的身份驗證。 – 2010-07-27 20:59:05

相關問題