NGINX Proxy 與 Windows Authentication 整合

NGINX Proxy 與 Windows Authentication 整合

最近在整合 NGINXReverse Proxy 時碰到一些 Windows Authentication 整合的問題,花費不少時間,特此筆記之。

一般的 Web App 在 NGINX Reverse Proxy 作用下都能正常運作,但內部網站有多許使用 Windows Authentication 功能來進行 SSO,例如,在 ASP.NET MVC 或 ASP.NET Core 的 View Page,只需透過一行 @User.Identity.Name 即可觸發瀏覽器進行身分驗證功能,在網域運作環境下,是不可多得好物。當然,你找網路可以找到許多教你設 proxy_set_header 的文章或討論:

proxy_set_header X-Real-IP          $remote_addr;
proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto  $scheme;
proxy_set_header Upgrade            $http_upgrade;
proxy_set_header Connection         "upgrade";

這是第一個卡關的地方,proxy_set_header 這條路怎麼試都不行

直到看到一位 Maxim Dounin 在討論區的回覆,預設開源(免費)版本的 NGINX 不支援。商用版才有支援 NTLM Authentication 功能,最入門的 PER INSTANCE 基本版要價 $2500/year (我點到結帳畫面,但沒顯示單位,我猜是 USD)。這有點像你想吃顆蘋果,賣場卻要你先買一台冰箱,冰箱裡裝著各種水果,任君挑選。還好,Maxim 提到還有一條路 stream proxy,一試 Bingo!

就在以為可以結案時,又碰到新的問題。

Firefox

Firefox NTLM Login

Google Chrome

Chrome NTLM Login

IE

IE 11 NTLM Login

Microsoft Edge

Microsoft Edge NTLM Login

使用 stream proxy 之後,非微軟官方的瀏覽器都能正常輸入「使用者名稱」「密碼」完成 Windows Authentication 登入!IE 該死,所以我下了如 "edge ntlm" 之類關鍵字,看了一堆討論後,我有點想吐血的感覺,討論的結論偏 Microsoft Edge 只支援 NTLM v2,也就是說,在 NTLM v1 環境中,Microsoft Edge 可能會有問題。不過,細想,這個推論是有問題的,原因在於,這個 SSO 登入不正常的問題是在經過 NGINX 才產生的,在不經過 NGINX 的情況下,所以瀏覽器都是正常運作的。

你可能找到二種解法:

  1. 調整:IE → 網際網路選項 → 安全性 → 近端內部網路 → 網站 → 進階 → 新增至區域
  2. 調整:IE → 網際網路選項 → 進階 → 取消「啟用整合式 Windows 驗證」

直接說,這二種都沒有用,不用在試了。我的青春浪費就好 >___<

實在沒辦法,請出 Fiddler 看底層資訊,發現,IE 與 Microsoft Edge 發出的 Authorization header 資訊和正常的 Firefox / Chrome 確實不同。不斷在瀏覽器之間登入測式時終於發現一個可疑的地方,IE 與 Microsoft Edge 都會帶網域資訊(請看上面的圖片)。這時的方向,就是想辦法如何 IE / Microsoft Edge 如何不帶網域來登入。

網路上解法又有很多種:

  1. 改機碼。
  2. 改群組原則。

這在本機或許可行,但在網域環境(很多使用者電腦)不太可行。

在早期登入 SSMS 時,有學到一個技巧「.\Bruce」,在瀏覽器上也可以用。不過當你輸入完「.\」會發現帶本機網域,這不是不我們想要用。又在一個討論中看到「\\UserName」解法:

Microsoft Edge Local Domain Login
Microsoft Edge Disable Domain Login

明燈呀,使用 \\UserName 順利取消了網域,也順利解決了 50% 的問題了。測試後發現,\\UserName 只有在比較舊 OS (例如,Windows 7)的 IE 上登入正常,Windows 10 的 IE 與 Microsoft Edge 登入還是不正常。

\\UserName 的語法稱 UNC Path。

如果又要不帶 Domain不帶本機呢?

\UserName」你想到了嗎?

這裡也說明導入 NGINX Reverse Proxy 的一個副作用,Windows Authentication 的 SSO 等於是失效的,在使用者使用 IE 或 Microsoft Edge 的情況下,他必須每次都重新登入。

NGINX 商用版可以申請 30 天試用。我就沒在費心力再去試另一個解決方法是否能更有效解決。

2 則留言:

  1. 試一下這個
    https://blog.miniasp.com/post/2014/01/10/configure-Internet-Explorer-security-zone-sites-using-group-polices.aspx

    回覆刪除
    回覆
    1. 文章有說明,群組原則不合適我們的情境哦。

      刪除

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。