The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

解決 IE10 瀏覽器無法使用 ASP.NET 表單驗證登入的問題

今天凌晨在客戶端上線,當程式佈署到正式機後發現我們的網站唯獨只有 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>

設定完成後,問題自然解決!

 

相關連結