Security

IIS7 未將授權傳播到子目錄

  • August 22, 2013

我們的應用程序正在使用表單身份驗證,並且該解決方案執行良好。

最近,我們的一台 2008 伺服器出現了一個問題,即授權未傳播到子目錄。換句話說,在主 web.config 中,我們有以下授權設置。

<authorization>
 <deny users="?" />
 <allow users="*" />
</authorization>

這會導致未經身份驗證的使用者重定向到登錄頁面(非常標準)。

樣式表位於 /Content/Styles 子目錄中,並且 Contents 目錄有另一個 web.config,它使用以下內容覆蓋授權:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
   <system.web>
       <authorization>
           <allow users="?" />
       </authorization>
   </system.web>
</configuration>

這應該允許未經身份驗證的使用者訪問樣式表目錄(也很標準)。

問題是伺服器對樣式表的請求被重定向到登錄頁面。

我已經嘗試刪除站點和應用程序池並重建它們,我還從伺服器中刪除了 IIS 角色,包括 WAS(Windows 程序啟動服務)並重新安裝。這些都沒有解決問題。

我知道配置是正確的,因為我可以使用相同的應用程序並將其放到新安裝的 Server 2008 上並且它可以工作。

知道如何在不重建整個機器的情況下解決這個問題嗎?

最終導致此問題的原因是 IUSR 帳戶無法訪問託管文件的目錄(儘管“網路服務”和應用程序池身份可以訪問該目錄)。當我在全新的 IIS7 安裝上進行測試時,我將目錄樹複製到 IUSR 已經可以訪問的 \inetpub\wwwroot 中。

目前尚不清楚為什麼這個問題表現為重定向到登錄頁面(好像它沒有正確傳播授權設置),但我確實發現了表單身份驗證配置的一些問題。

這部分很關鍵,因為我發現的所有內容都沒有正確(或充分)解釋這一點。

幾乎在我搜尋的所有地方,我都找到了 web.config 的以下設置。

<configuration>
 <system.web>
   <authentication mode="Forms">
     <forms loginUrl="~/login.aspx" />
   </authentication>
   <authorization>
     <deny users="?" />
     <allow users="*" />
   </authorization>
 </system.web>
</configuration>

通常解釋的方式是,未經身份驗證的使用者被重定向到 login.aspx,並且經過身份驗證的使用者被授予訪問權限。

實際上,此配置部分僅適用於 ASP.NET 頁面 (aspx)。任何其他類型的內容(html、asp、jpg 等)不受此配置的約束。

要保護這些類型的內容,您必須安裝“IIS 7 URL 授權”,並且它需要如下所示的 web.config 部分。

<system.webServer>
 <security>
   <authorization>
     <clear />
     <add accessType="Deny" users="?" />
     <add accessType="Allow" users="*" />
   </authorization>
 </security>
</system.webServer>

我看到一個地方解釋了 IIS6 與 IIS7 之間的區別,但這並不完全準確。不同類型的內容有不同的授權機制,如果你想限制對非 aspx 頁面的訪問,你需要兩者。

引用自:https://serverfault.com/questions/23610