[英]Url Authorization with MVC and ASP.NET Identity
我想保護我的應用程序中位於我的 mvc 應用程序路由之外的特定文件夾和資源。 我希望這些資源僅對經過身份驗證的用戶可用(只要他們經過身份驗證,哪個角色就無關緊要)。
最初似乎UrlAuthorizationModule將是答案。 我遵循了這篇文章, 了解 IIS 7.0 URL 授權,我可以讓模塊工作,因為它響應web.config
的配置元素。
我目前的問題是,我認為它是根據 IIS 中的匿名用戶而不是asp.net 身份中的經過身份驗證的用戶制定規則。
我使用標准的html
文件進行測試,而不是嘗試加載腳本,因為它也會在 MVC 管道之外加載。
Visual Studio 2015
。
.net 4.6.2
web 項目Individual User Accounts
添加到web.config
<configuration>
...
<location path="Data">
<system.webServer>
<security>
<authorization>
<clear/>
<add accessType="Deny" users="*"/>
<add accessType="Allow" users="?"/>
</authorization>
</security>
</system.webServer>
</location>
...
</configuration>
添加到文件夾結構
/Data/Protected.html // this file just has some basic Hello World content to display so you can see if it is loaded or not.
Data
路徑中的所有內容始終被拒絕,用戶是否通過身份驗證都沒有關系。web.config
為Deny
和Allow
切換 2 行,情況也是如此。Deny
行,那么即使用戶未通過身份驗證,也始終允許訪問。roles
與角色名稱,而不是users
屬性的作用也被完全忽略。 我錯過了什么? 如何讓Url 授權模塊與 MVC/WebAPI 和ASP.NET Identity Individual user accounts
或者這根本不可行?
我也願意接受其他想法,也許答案是編寫自定義HttpModule
或HttpHandler
?
為什么和細節
這些資源是 javascript 文件,簡而言之,只有一部分腳本可供未經身份驗證的用戶使用。 根目錄中有 2 個目錄,一個用於應用程序的認證部分,另一個用於應用程序的非認證部分。 這樣做的原因與應用程序中的用戶授權或安全性無關,它是為了將應用程序的暴露表面積限制為未經身份驗證的請求。
[TL;博士;]
轉到“Complete root web.config”部分以查看所需的 web.config 設置。
在隱身模式下測試以防止瀏覽器緩存問題! 並使用Ctrl+F5
因為腳本和 html 文件會被緩存。
首先拒絕根 web.config 中所有匿名用戶的訪問。
<authorization>
<deny users="?"/>
</authorization>
此處的 web.config 允許公開訪問一個文件夾。 在我的示例中,此文件夾稱為css
,位於 MVC 應用程序的根目錄中。 對於 css 文件夾,我將以下授權添加到根 web.config:
<location path="css">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
如果您需要更多公用文件夾,您可以添加更多這些位置路徑。
雖然在用戶登錄之前無法訪問所有其他文件,但始終可以訪問 css 文件夾及其內容。
我還在根 web.config 中添加了一個靜態文件處理程序,這很重要,因為您希望請求由特定文件類型的 asp.net 管道管理:
<handlers>
<add name="HtmlScriptHandler" path="*.html" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" />
</handlers>
完成根 web.config
<system.web>
<authentication mode="None" />
<authorization>
<deny users="?"/>
</authorization>
<compilation debug="true" targetFramework="4.6.2" />
<httpRuntime targetFramework="4.6.2" />
</system.web>
<location path="css">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
<system.webServer>
<modules>
<remove name="FormsAuthentication" />
<remove name="UrlAuthorization" />
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
</modules>
<handlers>
<add name="HtmlScriptHandler" path="*.html" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" />
</handlers>
</system.webServer>
默認情況下,ASP.NET 只會將允許和拒絕規則應用於托管處理程序處理的文件。 靜態文件不由托管處理程序管理。
您還可以設置:(如果不是真的需要,請不要這樣做! )
<modules runAllManagedModulesForAllRequests="true">
使用runAllManagedModulesForAllRequests="true"
所有 HTTP 模塊都將針對每個請求運行,而不僅僅是托管請求(例如 .aspx、ashx)。 這意味着模塊將在每個 .jpg ,.gif ,.css ,.html, .pdf, ... 請求上運行。
一件重要的事
您不必將 UrlAuthorizationModule 添加到 modules 部分,因為它已經是 ASP.NET 管道的一部分。 這意味着,它只會為托管文件運行,而不是靜態文件!
如果您現在刪除並重新添加 UrlAuthorizationModule 到模塊部分,它將在先決條件“integratedMode”下運行,而不再在“managedHandler”下運行! 並且因此可以訪問靜態文件。
<remove name="UrlAuthorization" />
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
<add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" preCondition="managedHandler" />
,那么 UrlAuthorizationModule 將不再限制對靜態文件的訪問。
您可以通過在注銷時成功訪問腳本文件夾中的腳本文件來測試這一點。 按 Ctrl+F5 以確保您獲得腳本文件的新副本。
ASP.NET UrlAuthorization <--> IIS URL Authorization 的區別
請務必記住 managedHandler 前提條件在 ASP.NET UrlAuthorization 模塊上。 前提條件告訴您,僅當處理請求的代碼映射到托管代碼(通常是 .aspx 或 .asmx 頁)時,才會調用 URL 授權模塊。 另一方面,IIS URL 授權適用於所有內容。 您可以從 ASP.NET Url Authorization 模塊中刪除 managedHandler 前提條件。 當每個請求(例如對 .html 或 .jpg 頁面的請求)都必須通過托管代碼時,它可以防止您必須支付的性能損失。
PS:一些 web.config 屬性區分大小寫!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.