今天又遇到詭異的問題,某個使用者開啟網頁OK,填好資料要送出時,IE會跳出詢問帳號密碼的對話框。IIS設定為整合式驗證,理論上開啟網頁時就已完成身份驗證了,Postback到同一網頁,實在沒理由再問第二次。更何況,其他的使用者使用同一網頁並沒有任何問題。

這個謎團在同事耐心連試三次登入後露出曙光...

連續用某個帳號登入三次後,網頁顯示寫入Log檔案存取被拒的訊息。這下真相大白了! 該使用者的個人資料有誤(這解釋了為什麼只有這位苦主要受此磨難),在Postback時引發錯誤,而Exception Handling的Code試圖寫記錄到Log檔,再因Log所在的目錄權限沒設好,寫檔被拒,因此IIS要求使用者另外提供身份,這就是Postback時又跑出登入視窗的由來。

由以上所結,ASP.NET程式在遇到Access Denied時都會要求重新認證身份嗎? 為什麼我印象中ASP.NET會直接傳回Access Denied訊息?

於是我做了以下的測試:

public partial class PermIssue : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
 
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        System.IO.File.WriteAllText("X:\\Temp\\NoPerm\\Test.txt", "AAA");
    }
}

我將X:\Temp\NoPerm設定成只有一個特定User才有權讀寫,按下Button1之後,結果立即傳回
Access to the path 'X:\Temp\NoPerm\Test.txt' is denied.
IIS並沒有顯示登入視窗要求提供其他身份? 這...這...這... 又是因為農曆七月嗎?

經過一番嘗試,我終於找到IIS會不會重新要求認證的關鍵在於web.config中的<identity impersonate="true"/>!

當impersonate設為true時,ASP.NET才會用使用者的身份去存取檔案等資源;預設值為false,不管用什麼身份登入網頁,ASP.NET永遠會用NETWORK SERVICE或ASPNET等專屬帳號存取資源,自然沒有換身份的必要。補上這點,所有的疑問都獲得解答,Case Closed!


Comments

# by Rex Tang

這一題 70-528 的考試會考喔...

Post a comment