遇到近年來數一數二的吊詭茶包。

有個 ASP.NET 測試網站近日由 Windows 整合驗證改為 Forms 驗證,卻在使用者瀏覽網頁時噴出大量 4625 登入失敗事件觸發警報。測試網站屬於另測試網域,用來登入帳號則是當時操作者本機的正式網域帳號,這行為似曾相似,在 AD Domain Controller 出現某主機的本機帳號登入錯誤出現過,應是 Windows 嘗試使用當下的登入帳號自動登入遠端主機造成的。

但吊詭的部分在於,這個行為在之前使用 Windows 整合驗證時沒出現過,改用 Forms 驗證時反倒逼出 AD 登入失敗錯誤!

試著要在另一台 IIS 上模擬,卻無法重現問題,感覺我這回遇上狠角色了。

既然問題跟網頁驗證有關,Fiddler 是最犀利的偵察工具,使用 Fiddler 側錄封包,經過反覆測試對照,終於解開謎團!!

下圖是重現問題的兩次測試,192.168.50.8 跟 win11lab 是同一台機器,我使用 Edge 分別連上 ℎttp://192.168.50.8/AuthTest 及 ℎttp://win11lab/AuthTest,兩次都有成功導向 Login.aspx,但 ℎttp://win11lab/AuthTest 這次觸發了上述的 Event 4625 登入錯誤:

【延伸閱讀】

由這個結果,一切就有了合理解釋。

  1. 登入失敗是怎麼來的?
    win11lab/favicon.ico 的第三個 Request,NTML Type 3,Domain = . / User = Jeffrey 呼應 Event 4625 資料吻合。
  2. 為什麼用 IP 沒事,用主機名稱才會出錯?
    跟 IE 的自動登入設定有關,192.168.50.8 被歸為網際網路,win10lab 機器名稱被歸為近端內部網路,與信任的網站常會設成自動登入。當 favicon.ico 傳回 401 時,便會使用目前的帳號自動登入。

    但,瀏覽器明明是 Edge 耶。Yes, Edge 這方面的行為仍依循 IE 的規則,連 Chrome 也會。
  3. 為何在另一台 IIS 沒有重現問題?
    問題主機被設為信任的網站,一開始不知道跟安全區域有關,使用 IP 測試,故未觸發自動登入。
  4. 之前用 Windows 驗證時沒這問題?
    其實也有。下圖為啟用 Windows 驗證的記錄,一開始會先自動登入(最前面三個 401),失敗後接續兩個 401 會彈出帳號密碼輸入框完成登入,之後下載 favicon.ico 時已登入完成,直接傳 404:

    但關鍵在於頻率。使用 Windows 驗證時自動登入失敗後會彈出帳號密碼輸入,而 Form 驗證的 favicon.ico 自動登入嘗試在背後執行,使用者因為操作遇到問題反覆測試,每次顯示登入網頁還沒敲密碼便已悄悄造成登入失敗,此時又重啟瀏覽器一試再試(中間沒有輸入密碼動作緩衝),讓失敗事件密集發生因而超過警報門檻。

知道問題了,要怎麼避免?最簡單的做法是將 IIS 根目錄(/) 設成匿名存取,存取 favicon.ico 時不需要認證;或是在 Login.aspx 網頁加上 <link rel="icon" href="data:,"> 避免 favicon.ico 下載動作 參考

A case that changing ASP.NET authentication from Windows to Forms causes event 4625 logon failed events.


Comments

# by 小黑

太強了

Post a comment