今天凌晨在客戶端上線,當程式佈署到正式機後發現我們的網站唯獨只有 IE10 瀏覽器無法成功登入,任何其他瀏覽器版本或使用較低的 IE 版本都可以正常登入,使用 IE 相容性檢視也都可以正常登入,想說會不會又是罄竹難書的 IE10 搞的鬼。後來用 Fiddler 工具檢查後發現 IE10 送出的 HTTP 標頭完全沒問題,該有的 .AUTH Cookie 都有送出,但使用表單驗證機制 (FormsAuthentication) 就是無法判斷該使用者已經登入,還真的再次鬼打牆,最後還是研究出解決方法。
簡單來說,這算是個 ASP.NET 2.0、3.5 與 4.0 的 Bugs,因為這兩個版本無法識別 IE10 的 User-Agent 標頭字串,所以無法正確識別用戶端的 IE10 瀏覽器版本,因而導致 ASP.NET 特定功能失效,在這個例子中,出問題的地方在於 ASP.NET 以為瀏覽器不支援 Cookies 功能,所以 ASP.NET 將不處裡任何與 Cookies 相關的程式碼!
以下是 IE10 的 User-Agent 標頭字串:
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)
這個問題早在 2011/4/16 就有人到 Microsoft Connect 網站回報過,而且經微軟官方確認這是個 Bug,爾後還發布了兩個 Hotfix 專門用來解決這個問題,各位如果遇到一樣的問題可以參考以下兩篇 KB 說明:
在這問題發現之後的 ASP.NET 版本已經修復了這個問題,所以我們在 Windows 8 上開發網站並不會有這個錯誤出現,所以上到客戶的正式機才出問題。
在此分享一個更簡易的解決方法,只要在網站目錄新增一個 瀏覽器定義檔 (browser definition file) 即可解決此問題,步驟如下:
1. 先在專案目錄或正式機網站跟目錄下新增一個 App_Browsers 資料夾
2. 新增一個副檔名為 *.browser 的檔案,例如:IE10Fix.browser,檔案內容如下:
<browsers>
<browser refID="Default">
<capabilities><!-- To avoid wrong detections of e.g. IE10 -->
<capability name="cookies" value="true" />
<capability name="ecmascriptversion" value="3.0" />
</capabilities>
</browser>
</browsers>
設定完成後,問題自然解決!
相關連結