2010-05-25 18 views
29

我有一個網站在共享主機上的ASP.NET 4.0服務器上運行,但完全信任。如何在IIS 7.5上使用ASP.NET表單身份驗證來保護靜態文件?

該網站是一個基本的「文件瀏覽器」,允許訪問者登錄並顯示可用的文件列表,顯然,下載文件。靜態文件(主要是pdf文件)位於站點上稱爲數據的子文件夾中,例如http://example.com/data/ ...

該網站使用ASP.NET表單身份驗證。

我的問題是:如何讓ASP.NET引擎處理數據文件夾中靜態文件的請求,以便對ASP.NET文件的請求進行身份驗證,並且用戶無法進行深層鏈接到一個文件,並抓住他們不被允許的文件?

最好的問候,埃吉爾。

回答

40

如果您的應用程序池在集成模式下運行,那麼您可以執行以下操作。

將以下內容添加到頂級web.config中。

<system.webServer> 
    <modules> 
     <add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" /> 
     <remove name="UrlAuthorization" /> 
     <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" /> 
     <remove name="DefaultAuthentication" /> 
     <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" /> 
    </modules> 
    </system.webServer> 

現在你可以使用標準的ASP.NET權限在你的web.config強制窗體身份驗證的目錄中的所有文件。

<system.web> 
    <authorization> 
     <deny users="?" /> 
    </authorization> 
    <authentication mode="Forms" /> 
</system.web> 
+0

謝謝喬爾。儘管如此。我沒有被允許在web.configs中使用不在網站根目錄的「身份驗證」部分,無論如何,它似乎與用戶一起工作。但是,當我有<允許角色=「xxx」/>時,我無法使其工作,他們不會進行身份驗證,但是如果我明確將用戶添加到允許列表並拒絕所有其他經過身份驗證的用戶,它就會起作用。 我在web服務器模塊部分缺少一些東西,以使其與角色以及用戶一起工作嗎? – 2010-05-27 15:09:47

+0

呃,謝謝!這不應該很難弄清楚。現在爲我工作。 – 2013-05-15 19:02:41

+0

這可以工作,但也可以阻止登錄頁面上使用的任何css/gif文件。任何方式讓這些展示? – eych 2013-12-14 14:52:17

12

我在獲取角色進行身份驗證時遇到同樣的問題。經過反覆試驗,我終於得到了它的一個小編輯工作@Joel坎寧安代碼:

<modules runAllManagedModulesForAllRequests="true" > 

我使用這兩個網站作爲參考:http://forums.iis.net/t/1177964.aspxhttp://learn.iis.net/page.aspx/244/how-to-take-advantage-of-the-iis-integrated-pipeline/

+0

這個作品!!!! ;) – NitroxDM 2014-05-07 17:18:17

+5

這只是廢話,通過使其工作,你不知道爲什麼。 由於所有託管模塊都能捕獲所有請求,因此會導致性能問題。 @約翰的解決方案是你需要的。 – Adaptabi 2014-09-04 08:36:31

+2

嘿,我同意@DotNetWise。如果必須,請確保櫻桃選擇將針對所有請求執行的模塊,而不是針對所有請求運行所有託管模塊。例如: - 注意前提條件爲空。 – Anton 2016-01-19 13:25:00

9

這是一個古老的線程,但我發生在它上面,遇到了和埃吉爾一樣的問題。下面是包括角色喬爾的修復版本:

<modules runAllManagedModulesForAllRequests="false"> 
     <remove name="FormsAuthenticationModule" /> 
     <add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" /> 
     <remove name="UrlAuthorization" /> 
     <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" /> 
     <remove name="RoleManager" /> 
     <add name="RoleManager" type="System.Web.Security.RoleManagerModule" /> 
     <remove name="DefaultAuthentication" /> 
     <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" /> 
</modules> 
4

附錄:

由於@eych指出,這也阻止訪問~/Content文件夾(或任何你有你的CSS),和~/Scripts,等等上。

如果您想允許例外 - 即允許未經身份驗證的用戶訪問某些文件/文件夾 - 您可以通過location元素進行操作。以下內容添加到web.config

<location path="Content"> 
    <system.web> 
     <authorization> 
     <allow users="*" /> 
     </authorization> 
    </system.web> 
    </location> 

更新: 一個更好的解決辦法是在默認情況下離開接入上 - 這將允許訪問你的CSS/JavaScript的/等等 - 應用「鎖定」(只),可在靜態內容存儲在文件夾:

<location path="data"> 
    <system.web> 
    <authorization> 
     <deny users="?"/> 
    </authorization> 
    </system.web> 
</location> 

警告:在我們的例子(MVC的網站),我們需要來裝飾與我們所有的控制器動作(除了登錄)。無論如何,這是一個好主意,但以前沒有必要(因爲之前的任何未經授權的請求已被重定向到登錄頁面)。

6

我想知道爲什麼需要重新添加默認添加的集成管道模塊(默認選項),所以我挖了更深一點。

您需要刪除並重新添加模塊,因爲默認情況下,模塊未添加默認選項。它們具有爲向後兼容性添加的前提條件,僅對註冊的ASP.NET處理程序(例如.aspx頁面)處理的內容運行。

默認看起來是這樣的:

<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" 
     preCondition="managedHandler" /> 

通過卸下模塊並重新加入他們沒有一個先決條件,這些單獨的模塊運行爲每一個請求(包括您的靜態內容)。它比啓用runAllManagedModulesForAllRequests更細化。

可以在當綜合管線與IIS 7引進了一對夫婦的文章讀到它:

注意,有一個錯字或模塊第二篇文章中的名字(和@約翰的答案)在某些時候從FormsAuthenticationModule改爲FormsAuthentication

設定IIS 7.5中的工作模塊通8.5看起來像這樣對我來說:

<system.webServer> 
    <modules> 
    <!-- Re-add auth modules (in their original order) to run for all static and dynamic requests --> 
    <remove name="FormsAuthentication" /> 
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" /> 
    <remove name="DefaultAuthentication" /> 
    <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" /> 
    <remove name="RoleManager" /> 
    <add name="RoleManager" type="System.Web.Security.RoleManagerModule" /> 
    <remove name="UrlAuthorization" /> 
    <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" /> 
    </modules> 
</system.webServer> 
+0

可能很明顯,但我會指出,根據您的具體情況,您可能不需要所有這些模塊(例如,我不需要RoleManager),並且您可能需要其他具有類似限制的其他模塊(如System.Web.SessionState)。 SessionStateModule – Shaun 2016-12-12 16:13:15

1

如果您的應用程序池在經典模式下運行,你可以做到以下幾點。您必須爲每個要處理的文件擴展名重複這些步驟,但我在此處使用.html

首先,頁面生成提供添加到Web.config:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.web> 
    <compilation> 
     <buildProviders> 
     <add type="System.Web.Compilation.PageBuildProvider" extension=".html"/> 
     </buildProviders> 
    </compilation> 
    </system.web> 
</configuration> 

然後添加一個頁面處理廠:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.web> 
    <httpHandlers> 
     <add type="System.Web.UI.PageHandlerFactory" path="*.html" verb="*"/> 
    </httpHandlers> 
    </system.web> 
</configuration> 

然後添加一個頁面處理程序:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
    <handlers> 
     <add scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" requireAccess="Script" preCondition="classicMode,runtimeVersionv2.0,bitness32" path="*.html" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" name="HtmlHandler-Classic-32" /> 
     <add scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" requireAccess="Script" preCondition="classicMode,runtimeVersionv2.0,bitness64" path="*.html" verb="GET,HEAD,POST,DEBUG" name="HtmlHandler-Classic-64"/> 
    </handlers> 
    </system.webServer> 
</configuration> 

這對我有用。 (信用:http://www.ifinity.com.au/Blog/EntryId/66/How-To-301-Redirect-htm-or-html-pages-to-DotNetNuke-aspx-pages。)

相關問題