記錄一下最近實驗整合式 Windows 驗證所碰到問題和解決方法。

基本設定

如果網站的驗證機制採用 Windows 整合式驗證,基本的步驟包括在 IIS 中將網站的驗證方法設定成不允許匿名存取,並且勾選「整合式 Windows 驗證」(只勾選這項,其他都不選),以及在 Web.config 中指定 <authentication mode="windows">。如果在 IIS 中的安全性設定勾選了多種驗證方法,其優先順序為匿名存取 > 整合式驗證 > 摘要式驗證 > 基本驗證。

測試存取網站

設定完成後,如果在本機瀏覽網站,例如:http://localhost/MyWeb/Default.aspx,就可以不用輸入帳號密碼,因為 IE 會直接把目前登入的使用者 token 傳遞給 IIS,告訴 IIS 這名使用者已經驗明正身了。(注意 IE 的進階選項中的「啟用整合的 Windows 驗證」是否有勾選)

問題一:在伺服器上用 127.0.0.1 存取仍然要輸入帳號密碼

如果你改用 127.0.0.1,例如:http://127.0.0.1/MyWeb/Default.aspx,卻會發現 IE 會彈出一個視窗要你輸入帳號密碼。為什麼 localhost 沒問題,127.0.0.1 卻會要求輸入帳號密碼?

原因是出在 IE。只要你輸入的網址裡面有點("."),IE 就會認為你要存取的網頁是位於 Internet 區域,因此即使網站的驗證方式是整合式驗證,IE 基於安全考量,還是會要求輸入帳號密碼。如果你的網站是位在 Intranet 區域,而且希望 IE 不要彈出這個視窗,就可以在 IE 的「網際網路選項」的「安全性」頁夾中點選「近端內部網路」,再點「網站」鈕。此時會開啟一個對話窗讓你加入 intranet 的網址,你可以加入 http://127.0.0.1 或其他區域內網的網址,這樣以後 IE 碰到這些網址就會視為 intranet 的存取,就不會再要求輸入帳號密碼了。如果覺得這樣太麻煩的話,直接用電腦名稱也可以,例如:http://machine-name/MyWeb/,因為裡面沒有點("."),IE 會當它是近端網址。

問題二:localhost 竟然也要輸入帳號密碼

接著將程式部署到另一台 Windows Server 2003 R2 之後,在該台機器上重複執行前面的測試,結果卻連 http://localhost/MyWeb/ 也會提示輸入帳號密碼,而且即使帳號密碼正確,也無法驗證通過。連續輸入三次之後,顯示錯誤訊息:

'/_layouts' 應用程式中發生伺服器錯誤。

Runtime 錯誤

描述: 伺服器上發生應用程式錯誤。此應用程式目前的自訂錯誤設定,會防止應用程式錯誤的詳細資訊被他人檢視。

詳細資料: 若要在本機伺服器電腦上檢視此特定錯誤訊息的詳細資訊,請在目前 Web 應用程式根目錄內的 "web.config" 組態檔中建立 <customErrors> 標記。然後將此 <customErrors> 標記的 "mode" 屬性設成 "RemoteOnly"。若要在遠端電腦上檢視詳細資訊,則需將 "mode" 設為 "Off"。

 

<!-- Web.Config 組態檔 -->

<configuration>
    <system.web>
        <customErrors mode="RemoteOnly"/>
    </system.web>
</configuration>


注意: 可以藉由修改應用程式 <customErrors> 組態標記的 "defaultRedirect" 屬性,使其指向自訂錯誤頁面的 URL,以便使用自訂錯誤頁面取代您目前看到的錯誤頁面。

 

<!-- Web.Config 組態檔 -->

<configuration>
    <system.web>
        <customErrors mode="On" defaultRedirect="mycustompage.htm"/>
    </system.web>
</configuration>

這個錯誤似乎與 Windows 2003 升級到 R2 之後所安裝的 Windows Sharepoint Service 2.0 有關。將 WSS 2.0 移除之後,localhost 的測試便成功了。

如果開啟事件檢視器,在應用程式事件中可能會看到這個錯誤訊息:目前的信任等級不支援除錯。但是 machine.config 的 trust level 是設定成 full trust,而自己的應用程式的 web.config 也沒有修改相關的設定。這個錯誤訊息似乎也跟 WSS 2.0 有關。總之,移除 WSS 2.0 之後,一切就正常了。

問題三:從別台機器存取網站

現在要從別台機器存取網站,以便完成最終的測試。此時比較需要注意的問題是用戶端機器的網路設定是否 有指定正確的 DNS 伺服器,以及應用程式伺服器(IIS)上面的防火牆設定,要確定 80 port 有放行。如果程式會連接到別台資料庫伺服器,則資料庫伺服器所在的機器也必須開啟相關的連接埠(SQL Server 預設為 TCP 1433)。

參考資料:

http://support.microsoft.com/?id=258063