前陣子遇到一個很怪的問題,在正常的安裝下竟然有個專案從 SVN 版本庫簽出後無法正確安裝至我本機的 IIS7 中執行,甚至於無法在 Visual Studio 執行建置(Build),而且錯誤的狀況都是跟權限有關,但我花了好一段時間才將這個問題解決,原來就是卡在一個很小的地方沒注意到。
這次發生的錯誤訊息如下:
Access to the path 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\Project1\265814f7\8b06370e\App_Code.compiled' is denied.
這代表在 ASP.NET 動態編譯時期就無法完成,因為動態編譯的過程中無法存取動態產生的檔案,以致於無法正確編譯網站程式,所以發生錯誤。
以前我也曾經遇過這個問題,這通常與應用程式集區的執行身份識別有關(請見 IIS應用程式集區自訂身份識別後如何讓 ASP.NET 正常執行 一文),但這次狀況更奇怪,通常在 IIS 下無法執行的狀況只要把自訂身份識別的帳戶加入 IIS_WPG 群組 (IIS6) 或加入 IIS_IUSRS 群組 (IIS7) 即可,而且通常在 Visual Studio 編譯時用的是登入者的身份 (Administrator),怎麼可能會有無法編譯且沒有權限的情勢發生呢?
以下是在 Visual Studio 編譯時所發生的錯誤訊息:
------ Build started: Project: D:\...\WebSite1\, Configuration: Debug Any CPU ------
Validating Web Site
Building directory '/WebSite1/App_Code/'.
(0): Build (web): Could not load file or assembly 'AntiXssLibrary, Version=3.1.3524.16873, Culture=neutral, PublicKeyToken=d127efab8a9c114f' or one of its dependencies. Access is denied.
Validation Complete
========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========
所以是在 Validating Web Site (驗證網站) 時發生「存取被拒(Access is denied)」的情況,但這代表我 (Administrator) 無法驗證網站嗎?
最後查到原因是因為在 web.config 定義了以下這段
<identity impersonate="true" userName="UserA" password="Passw0rd" />
因為在 web.config 已經定義了 變身 (Impersonation) 的設定,所以在 Visual Studio 中建置時,雖然可以正確編譯網站,部署到公司內的測試機也可以執行,但在編譯時的驗證網站這一段會以該 UserA 使用者的身份執行,而該使用者在我本機剛好也不隸屬於任何群組,所以也沒有任何權限,導致建置時無法在 ASP.NET 的暫存目錄 (C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files) 寫入檔案,以致於無法 建置(Build)成功!
最後我將該使用者 UserA 加入到 IIS_IUSRS 群組,所有問題自然迎刃而解,如下圖示:
這問題一開始並沒那麼直覺,只是覺得納悶說為什麼會有 存取被拒(Access is denied) 的情況,經過一個小時的盤查才查出結果。