讀者 sam 問了一個好問題:

參考網路資料在 web.config 加入 <authentication mode="Windows" /> 並使用 IIS 10 管理員停用 Anonymous、啟用 Windows 驗證,可實現 Windows/AD 帳號登入。 但即使不設定 <authentication mode="Windows" />,一樣可以正常執行,何解?

我知道 IIS 管理員的驗證設定與 web.config system.web/authentication 設定是不同的東西,但差異細節又說不出所然,趁著這個機會將相關知識梳理一番。

  1. IIS 啟用停用匿名驗證、Windows 驗證的設定不是儲存在 web.config,而是在 C:\Windows\System32\inetsrv\config\applicationHost.config

    如下圖的 <windowsAuthenticaitaon> 與 <anonymousAuthentication>
  2. ASP.NET 驗證相關設定有兩處:
  3. web.config 裡也有 system.webserver 區段,也能用來設定 IIS 驗證嗎?
    不行,會得到以下錯誤:

    原因是相關設定被設成 overrideModeDefault="Deny",統一在 applicationHost.config 控制,不允許 web.config 覆寫:

    修改 overrideModeDefault 可解除限制,但開放 web.config 設定會降低安全性,不建議。
  4. 為什麼指定 IIS 只開啟 Windows 驗證,不必設 <authentication mode="Windows" /> 也能正常執行?
    因為 <authentication> mode 的預設值是 Windows。(我沒能找到官方文件依據,但有找到參考1參考2) 實測 mode="Windows" 在匿名或 Windows 驗證下都能正常運作。

Explain the difference and relationship between system.webServer/security/authentication and system.web / authentication.


Comments

# by Sam

黑大 您好: 非常感謝您的說明,讓我可以了解整個運作機制,感謝。

# by NS

我想詢問 已設定 IIS Basic Authentication 基本驗證,關閉匿名驗證。 在電腦 Windows Chrome 跟 Android Chrome 測試都可以正常輸入並使用。 但在 Android LINE APP 上面都會變成 401 未經授權 他不會跳問帳號密碼的畫面 想詢問是不是 LINE APP 的瀏覽器都完全不支援 Basic Authentication 導致的? 此況如果真的需要登入驗證但再 LINE APP 上面的瀏覽器都無效,是不是只能後端寫程式去處理?(例如改成去寫 LINE Login 去驗證....?)

# by Jeffrey

to NS, 我沒查到 LINE App 或 Android 內嵌瀏覽器是否支援 Basic Authentication 的資料,但 Basic Authentication 因為在 Header 使用未加密的 Base64 編碼傳送帳號密碼普遍被認為不安全,若非高度要求向前相容,是很有可能不支援。

# by NS

to Jeffrey 了解,謝謝。 後來我們改用 URL 加上參數 ?openExternalBrowser=1 的方式,讓 LINE APP 點下去會去外面看其他瀏覽器 APP。 迴避 LINE APP 內部瀏覽器不支援驗證的問題

# by alonso

感謝大大的好文章 讓我收穫真的很多....

# by Andy

Dear 黑暗大 您好 想跟您請教關於 IIS 使用 Windows 驗證的相關問題,如果使用這種驗證方式,是不是無法做出登出的功能 在網路上有找到一些登出的寫法(應該是清除cookie吧 ?),執行後都沒有辦法達到登出的效果 ASP.NET C# 登出按鈕程式如下 還請黑暗大能解惑,感謝您 protected void Button_LogOut_Click(object sender, EventArgs e) { FormsAuthentication.SignOut(); //清除所有的 session Session.RemoveAll(); //建立一個同名的 Cookie 來覆蓋原本的 Cookie HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, ""); cookie1.Expires = DateTime.Now.AddYears(-1); Response.Cookies.Add(cookie1); //建立 ASP.NET 的 Session Cookie 同樣是為了覆蓋 HttpCookie cookie2 = new HttpCookie("ASP.NET_SessionId", ""); cookie2.Expires = DateTime.Now.AddYears(-1); Response.Cookies.Add(cookie2); Response.Redirect("Login.aspx"); }

# by Jeffrey

to Andy,IIS Windows 驗證會跟著 TCP 連線 ( 延伸閱讀:https://blog.darkthread.net/blog/iis-winauth-and-connection-reuse/ ) ,除非使用者關閉瀏覽器或另開無痕,你無法強迫使用者登出換身分 (亦即 Page.User.Identity 不會變);除非系統認定身份以 Session 或 Cookie 為準,而非 Page.User,那麼清 Cookie 的手段才會有效果。

# by Andy

Dear 黑暗大 了解,確實我的狀況就是<除非使用者關閉瀏覽器或另開無痕>才會要求重新 key 帳號密碼 感謝您的回覆

# by kevin

想問一下 有辦法把IIS權限設定成 用戶端的window登入身分嗎?

# by Jeffrey

to kevin, 你說的應該是這個 https://learn.microsoft.com/zh-tw/troubleshoot/developer/webapps/aspnet/development/implement-impersonation 這做法在安全管控上比較複雜,實務上很少聽到有人使用,不確定新版 ASP.NET 是否支援

Post a comment