IIS7 未將授權傳播到子目錄
我們的應用程序正在使用表單身份驗證,並且該解決方案執行良好。
最近,我們的一台 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 頁面的訪問,你需要兩者。