The Will Will Web

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

IIS6:HTTP 401.1 - 未經授權:因認證無效而存取遭到拒絕

我有個客戶的主機位於中國大陸,作業系統是簡體版的 Windows Server 2003,預設網站停用中,正式網站的站台可以正常運作,但我們做的新網站安裝完之後卻發現總是無法遠端瀏覽,只能在本機看到網頁與程式都正常執行,遠端看的時候主要錯誤訊息為「HTTP 错误 401.1 - 未经授权:访问由于凭据无效被拒绝。」這台主機實在不知道被多少人荼毒過,怎麼設定就是無法讓網站成功安裝起來,即便連靜態檔案都無法存取,心裡雖然明白重灌就能解決問題,但一份不服輸的精神總想著要釐清問題才能終身解除夢魘,所幸皇天不負苦心人,問題終於找到了答案。

先分享我所有找答案失敗的過程,這些過程每個都有其背景知識,也許有任何一個環節都是未來可能會遇到的,而解決權限問題的思路也非常重要,這些都有助於未來快速釐清類似的問題。

在我新增完一個全新的站台後,問題的主要徵狀如下描述:

  • 該主機的 IIS6 有兩個原本就有的站台,與一個我們這次才新增的站台
    • 預設站台:已停用
    • 站台 1:���前舊版網站正常使用中
    • 站台 2:本次新增的站台(也就是有問題的站台)
  • 這個新增的 站台 2 在這台 Windows Server 2003 本機可以正常瀏覽網頁
  • 當試圖透過遠端主機瀏覽該網頁時,就會立即出現要求登入的畫面 (如下圖示)

看到登入視窗基本上就不對了,因為我們要的是讓網站可以匿名瀏覽網頁,所以按下取消或輸入錯誤的帳號密碼就會立即看到「HTTP 错误 401.1 - 未经授权:访问由于凭据无效被拒绝。」錯誤訊息。

根據錯誤訊息來看,我肯定這是與權限有關的錯誤,因此我就把找問題的方向給先定下來。

既然我們這網頁要求匿名訪問,當然先去看匿名訪問的安全性設定

我比對了預設站台的設定這次新增的 站台 2 設定,完全一模一樣,因此不疑有他的繼續下一條線索:

接著檢查 IP 地址和域名限制,預設也是授權訪問,應該不會有這個問題,所以繼續跳過:

然後我查看應用程式集區的設定,並發現預設站台、站台 1 與站台 2 的應用程式集區是一樣的,因此也不可能是應用程式集區的權限問題:

接著我檢查網站目錄的 NTFS 檔案權限,我發現這部分也是沒問題的!

查看進階權限設定也看不出有權限不足的情況:

我看了這麼多可能的地方,還是無法讓網頁正常瀏覽,都是一樣的錯誤訊息,已經快到走投無路的時候,想起了 Windows 界的瑞士刀 Sysinternals 工具組,並使用 Process Monitor 查看有沒有任何透過 IIS 存取檔案的地方,結果還是一樣讓人哀傷,當透過遠端瀏覽的時候,IIS 根本沒有對該檔案進行存取動作,這也代表著 IIS 被卡在 認證 (Authentication) 這一關過不去

接著我想到了可以從事件檢視器查看安全性事件,也因此發現了有一筆 IUSR_A-EE2135DE33C84 的驗證失敗紀錄,你可能會想這就怪了,站台 1 與 站台 2 也是完全相同的設定啊,為什麼新增的站台就會有權限的問題呢??!!

難道~ 這幾個站台的匿名存取帳戶所設定的密碼不一樣?有可能嗎?!太扯了吧!誰這麼無聊會去改這種設定啊!!( 生氣 … >”< )

首先,Windows 內建的 IUSR_A-EE2135DE33C84 匿名帳戶密碼多少我不知道,但我知道這個密碼是可以改的,以前我只知道這個密碼改掉了之後會很麻煩,因為以往我們再設定這種系統內建的服務帳戶、密碼時,最直覺的方式就是不輸入密碼就代表使用系統預設的密碼,但當時並不知道為為什麼要這樣,不過經過這次茶包修復的經驗之後,一整個打通多年前濛濛懂懂的疑惑。

經過一番測試與驗證之後,我終於可以確認新增的 站台 2 站台 1 所設定的匿名帳戶密碼是不一致的 (因為預設站台並沒有啟用,所以就先跳過不管),接著變試著從 IIS 的 Metabase 中找出那些設定:

首先先進入 C:\Inetpub\AdminScripts 目錄,並執行以下指令查詢預設站台 1 的匿名帳戶密碼為何:
備註: 175255 為你的站台 ID,不同站台 ID 就會不一樣喔!

cscript adsutil.vbs get w3svc/175255/root/anonymoususerpass

可惜的是,基於安全理由預設密碼是不會顯示出來的,但還好我有找到 KB909887 文件有教如何將密碼顯示出來,因此這才確認了這台主機的 IUSR_A-EE2135DE33C84 匿名帳戶密碼真的被修改過了,而且我確認當初的工程師在修改過該帳戶的密碼後還手動去修改了站台 1 的匿名帳戶密碼,想當然的,這種改密碼的事情怎麼會有文件呢!我半路接手這台主機要設定網站,怎麼可能會有這些資訊,因此花了好幾天才釐清並解決這個問題。

IIS 中有個地方儲存了 IUSR_* 的預設密碼,這個密碼是從 Windows 安裝時就賦予的,而且每台電腦都不一樣,不是無聊人不會去修改這個密碼才對,因此任何新增的站台都會自動繼承這個預設匿名帳戶密碼,這也是為什麼只要新增站台就會發生「HTTP 错误 401.1 - 未经授权:访问由于凭据无效被拒绝。」這個問題的主要原因!

一勞永逸的解決辦法有兩種:

  1. 找出 IIS6 預設的匿名帳戶密碼,並將 IUSR_* 帳戶的密碼重設回復到出廠狀態的密碼,這個步驟可以參照 KB909887 來完成設定。
  2. cscript adsutil.vbs get w3svc/anonymoususerpass
  3. 改掉 IIS6 預設的匿名帳戶密碼,如此一來日後新增的站台就可以預設繼承 IIS Metabase 的密碼設定,也不會再次發生 HTTP 401.1 的錯誤了。(備註:以下 NEWPASSWORD 請換成新的密碼
  4. cscript adsutil.vbs set w3svc/anonymoususerpass NEWPASSWORD

 

心得分享

我記得在兩年前的明天說過一句話:「你永遠不知道接手一個爛案子可以學到多少開發經驗!唯有正向思考才能讓你進步,抱怨只會讓自己越來越消極~」( 好巧耶,只差一天剛好滿兩年 XD )

這句話到了今天我還是覺得非常認同,我知道當下處理問題的情緒與憤怒,在解決問題時的當下要能夠不帶情緒的正向思考是有難度的,過程中是否擁有正面能量幫助你走過這段路我覺得很重要,我知道問題一定會被解決 (這需要自信),而當你的正面能量大過負面能量時,你就會用微笑帶著草泥馬陪你一路過關斬將,過程中或許髒話不斷,但是不會給其他人帶來負面情緒與壓力,甚至於激起其他人的共鳴陪你一起解決困難,進而享受在解決問題的情境之中。

很多事情一體多面,工作中難免遇到許多無理的、無助的、無力的問題,若能對每一件事情用好的、正向的角度去思考、去體驗,我想遇到再多的困難都不會害怕,也不會因為負面情緒在心中內耗而感覺到疲累,與各位共勉之。 ^_^

相關連結