2011-05-18 34 views
1

我正在使用ASP.NET 4.0 Framework.I有一個包含10個PDF文件的目錄,例如pdf1,pdf2 .... pdf10。在按鈕單擊我使用Response.Redirect &傳遞Pdf文件路徑,以便在瀏覽器中打開它。但是,這使用戶能夠使用此URL查看PDF文件夾的路徑(url),他可以直接打開任何其他pdf。我怎樣才能阻止他直接從URL訪問PDF如何防止用戶直接輸入url

+2

我想,除非你創造一些類型的認證機制,這將是困難的。 – faester 2011-05-18 08:47:50

回答

8

使用Request.ServerVariables["HTTP_REFERER"]這會告訴你請求來自哪裏。如果它不在您的網站上,則採取適當的措施。

例如

if(Request.ServerVariables["HTTP_REFERER"].ToLower().IndexOf("mysite.com") == -1){ 
    // Not from my site 
    Response.Redirect("NotAllowed.aspx"); 
} 
+1

你能否詳細說一下你的意思。 – 2011-05-18 08:50:37

+1

對我來說,這很清楚他的意思 – 2011-05-18 08:51:42

+1

如果重定向的url直接轉到pdf,這是行不通的,因爲沒有地方可以運行此代碼。需要做的是重定向到一個httphandler,以便在流式傳輸pdf之前進行檢查。 – 2011-05-18 09:00:09

1

這個link可能會幫助你阻止他直接從URL訪問PDF。

+0

如果您想在流式傳輸pdf之前執行某種服務器端檢查,那麼使用httphandler是正確的選項。 – 2011-05-18 09:01:56

0

您將需要添加一個安全層。如果您使用的是MVC,實現它可能會更簡單,因爲您將在控制器操作中執行授權。但是,對於傳統的ASP,您可能需要實現自定義處理程序。

+0

*大聲笑*:托馬斯有你的答案! – 2011-05-18 08:55:31

0

有沒有簡單的解決方案。你可以根據服務器的日期/時間來設計一些滾動代碼,這些日期/時間必須是查詢字符串的一部分,並且在頁面加載時檢查它的正確性,如果你使它足夠複雜/冗長,那麼人們將無法手動輸入。

1

使用此代碼在Global.asax.cs中並調用[NoDirectAccess]所有控制器

//Prevent direct URL access: Call [NoDirectAccess] to all controllers to block 
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
    public class NoDirectAccessAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      if (filterContext.HttpContext.Request.UrlReferrer == null || 
         filterContext.HttpContext.Request.Url.Host != filterContext.HttpContext.Request.UrlReferrer.Host) 
      { 
       filterContext.Result = new RedirectToRouteResult(new 
           RouteValueDictionary(new { controller = "Home", action = "Login", area = "" })); 
      } 
     } 
    }