【茶包射手日記】ASP.NET 改用 Form 驗證反而引發 AD 登入錯誤
1 |
遇到近年來數一數二的吊詭茶包。
有個 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 登入錯誤:
【延伸閱讀】
由這個結果,一切就有了合理解釋。
- 登入失敗是怎麼來的?
win11lab/favicon.ico 的第三個 Request,NTML Type 3,Domain = . / User = Jeffrey 呼應 Event 4625 資料吻合。
- 為什麼用 IP 沒事,用主機名稱才會出錯?
跟 IE 的自動登入設定有關,192.168.50.8 被歸為網際網路,win10lab 機器名稱被歸為近端內部網路,與信任的網站常會設成自動登入。當 favicon.ico 傳回 401 時,便會使用目前的帳號自動登入。
但,瀏覽器明明是 Edge 耶。Yes, Edge 這方面的行為仍依循 IE 的規則,連 Chrome 也會。 - 為何在另一台 IIS 沒有重現問題?
問題主機被設為信任的網站,一開始不知道跟安全區域有關,使用 IP 測試,故未觸發自動登入。 - 之前用 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 小黑
太強了