簡體   English   中英

使用 MVC 和 ASP.NET Identity 的 URL 授權

[英]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 項目
    • MVC模板
    • 身份驗證 = Individual User Accounts
  • IIS 8(用於在 Visual Studio 外進行測試
    • 身份驗證 -> 匿名身份驗證(啟用)

添加到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.configDenyAllow切換 2 行,情況也是如此。
  • 如果我完全刪除了Deny行,那么即使用戶未通過身份驗證,也始終允許訪問。
  • 如果我添加一個角色,並使用roles與角色名稱,而不是users屬性的作用也被完全忽略。

怎么辦?

我錯過了什么? 如何讓Url 授權模塊與 MVC/WebAPI 和ASP.NET Identity Individual user accounts或者這根本不可行?

我也願意接受其他想法,也許答案是編寫自定義HttpModuleHttpHandler


旁注

為什么和細節

這些資源是 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" />


如果您將前提條件設置為 managed: <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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM