IdentityServer 部署踩坑記

来源:https://www.cnblogs.com/weihanli/archive/2020/04/07/12653954.html
-Advertisement-
Play Games

IdentityServer 部署踩坑記 Intro 周末終於部署了 以及 項目,踩了幾個坑,在此記錄分享一下。 部署架構 項目是基於 "IdentityServerAdmin" 項目修改的,感謝作者的開源付出,有需要 IdentityServer 管理需求的可以關註一下,覺得好用的可以給個 sta ...


IdentityServer 部署踩坑記

Intro

周末終於部署了 IdentityServer 以及 IdentityServerAdmin 項目,踩了幾個坑,在此記錄分享一下。

部署架構

項目是基於 IdentityServerAdmin 項目修改的,感謝作者的開源付出,有需要 IdentityServer 管理需求的可以關註一下,覺得好用的可以給個 star 支持一下 https://github.com/skoruba/IdentityServer4.Admin

實際部署的有兩個服務,一個是 IdentityServer 項目(https://id.weihanli.xyz),一個是 IdentityAdmin 項目(<https://id-admin.weihanli.xyz>)。

兩個服務都是部署在一臺伺服器上,這一臺伺服器上部署一個單節點的 kubernetes,兩個服務都是部署在 k8s 上並通過 NortPort 的方式對外提供服務,外面有一層 nginx 做了請求轉發同時提供對外 https 的支持。

image-20200407151639076

最初的 nginx 配置如下

server {
      listen 443;
      ssl_certificate            /home/pipeline/.acme.sh/*.weihanli.xyz/*.weihanli.xyz.cer;
      ssl_certificate_key      /home/pipeline/.acme.sh/*.weihanli.xyz/*.weihanli.xyz.key;
      server_name id.weihanli.xyz;

      location / {
         proxy_pass http://172.17.0.2:31210;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     }
}
server {
      listen 443;
      ssl_certificate            /home/pipeline/.acme.sh/*.weihanli.xyz/*.weihanli.xyz.cer;
      ssl_certificate_key      /home/pipeline/.acme.sh/*.weihanli.xyz/*.weihanli.xyz.key;
      server_name id-admin.weihanli.xyz;

      location / {
         proxy_pass http://172.17.0.2:31211;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     }
}

IdentityServer重定向到內網地址

部署起來之後,IdentityServer 可以訪問,但是 IdentityAdmin 訪問的時候會重定向到 IdentityServer 去登錄,在發生重定向的時候會重定向到內網地址,重定向到了 172.17.0.1:31210 這個內網地址,這個地址是一個內網地址,公網肯定是沒有辦法訪問的,在網上 Google 了半天發現有個類似的問題 網路迴流(NAT Loopback/ Hairpin NAT),大概就是在同一網段的內網中的兩個服務通信的時候通過公網功能變數名稱沒有辦法訪問,會轉換成內網IP訪問,所以發生重定向的時候會出現原本是功能變數名稱重定向但是卻變成了內網IP(不確定我的這種情況是不是屬於網路迴流的情況,有網路大佬的話可以幫忙分析一下,萬分感謝)

因為使用了 nginx 並且轉發後的內網 IP 地址是 nginx 轉發到的請求地址,所以又 Google 了 nginx proxy redirect 關鍵詞,最後找到一個解決方案 https://unix.stackexchange.com/questions/290141/nginx-reverse-proxy-redirection

最後生效的 nginx 完整配置如下:

server {
      listen 443 http2;
      ssl_certificate            /home/pipeline/.acme.sh/*.weihanli.xyz/*.weihanli.xyz.cer;
      ssl_certificate_key      /home/pipeline/.acme.sh/*.weihanli.xyz/*.weihanli.xyz.key;

      server_name id-admin.weihanli.xyz;

      location / {
         proxy_pass http://172.17.0.2:31211;
         proxy_redirect http://172.17.0.2:31210/ https://id.weihanli.xyz/;
         proxy_set_header Host $host;
         proxy_set_header Referer $http_referer;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     }
}

增加了上面的配置之後再發生重定向的時候地址就是正確的了,不再是一個內網IP 了

Invalid Token

Identity Server 重定向的問題解決之後,馬上就出現了新的問題。。。

首先在 Identity Server 登錄成功之後返回到 IdentityAdmin 的時候會報錯,查看日誌可以看到是 token 不合法的問題,起初是 issuer 不對的問題,我想可能是 issuer 可能 http/https 不一致的問題,於是增加了一個配置,直接在註冊 IdentityServer 的時候使用指定的 issuer ,想著這樣就不會有 http/https 的問題,於是重新部署,重新嘗試之後,token 還是有問題,日誌顯示是token 簽名驗證錯誤,這時不經意之間看了一眼 IdentityServer 的 發現文檔,打開之後發現裡面的各種 endpoint 都是 http 的,後來發現 IdentityServer 有一個 PublicOrigin 的配置,把這個配置配置成 https://id.weihanli.xyz 之後就沒有 invalid token 之類的錯誤了,再看發現文檔的時候,endpoint 也是基於 https 的了。

Identity-Admin 502

IdentityServer 登錄成功之後重定向到 IdentityAdmin 的時候 502,但是服務是存在的 在日誌里只找到下麵這樣的錯誤日誌

Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolException: Message contains error: 'invalid_grant' , error_description: 'error_description is null', error_uri: 'error_uri is null'

在網上 Google 之後找到了這個issue: https://github.com/IdentityServer/IdentityServer4/issues/1670,嘗試了下麵這個解決方案解決了,是因為重定向的時候請求信息太大了

nginx 中 IdentityAdmin 項目增加配置:

proxy_buffer_size          128k;

proxy_buffers              4 256k;

proxy_busy_buffers_size    256k;

修改之後,執行 sudo nginx -s reload 重新載入配置之後就正常了

More

最後現在在用的有效的完整的 nginx 配置如下:

server {
      listen 443 http2;
      ssl_certificate            /home/pipeline/.acme.sh/*.weihanli.xyz/*.weihanli.xyz.cer;
      ssl_certificate_key      /home/pipeline/.acme.sh/*.weihanli.xyz/*.weihanli.xyz.key;

      server_name id.weihanli.xyz;

      location / {
         proxy_pass http://172.17.0.2:31210;
         proxy_redirect off;

         proxy_set_header Host $host;
         proxy_set_header Referer $http_referer;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     }
}

server {
      listen 443 http2;
      ssl_certificate            /home/pipeline/.acme.sh/*.weihanli.xyz/*.weihanli.xyz.cer;
      ssl_certificate_key      /home/pipeline/.acme.sh/*.weihanli.xyz/*.weihanli.xyz.key;

      server_name id-admin.weihanli.xyz;

      location / {
         proxy_pass http://172.17.0.2:31211;
         proxy_redirect http://172.17.0.2:31210/ https://id.weihanli.xyz/;
         proxy_buffer_size          128k;
         proxy_buffers              4 256k;
         proxy_busy_buffers_size    256k;
         proxy_set_header Host $host;
         proxy_set_header Referer $http_referer;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     }
}

Reference


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大家一直都在談論微服務架構,園子裡面也有很多關於微服務的文章,前幾天也有一些園子的朋友問我微服務架構的一些技術,我這裡就整理了微服務架構的技術棧路線圖,這裡就分享出來和大家一起探討學習,同時讓新手對微服務相關技術有一個更深入的瞭解。 ...
  • 1、前言 微服務架構已成為目前互聯網架構的趨勢,關於微服務的討論,幾乎是各大技術論壇、技術大會的熱門話題。而Surging是高性能的模塊化微服務引擎,是大家首選微服務引擎架構之一,而針對於框架有個突出的缺點就是只能支持基於.NET CORE開發,而現如今各大公司開發語言是多樣的,每個業務線有各自開發 ...
  • 項目介紹 Blazor 是一個使用 .NET 生成互動式客戶端 Web UI 的框架: 使用 C# 代替 JavaScript 來創建豐富的互動式 UI。 共用使用 .NET 編寫的伺服器端和客戶端應用邏輯。 將 UI 呈現為 HTML 和 CSS,以支持眾多瀏覽器,其中包括移動瀏覽器。 使用 .N ...
  • 儘管可在任意WPF項目中編寫自定義元素,但通常希望在專門的類庫程式集(DLL)中放置自定義元素。這樣,可在多個WPF應用程式之間共用自定義元素。 為確保具有正確的程式集引用和名稱空間導入,當在Visual Studio中創建應用程式時,應當選擇Custom Control Library(WPF)項 ...
  • 在控制項模板和為其提供支持的代碼之間又一個隱含約定。如果使用自定義控制項模板替代控制項的標準模板,就需要確保新模板能夠滿足控制項的實現代碼的所有需要。 在簡單控制項中,這個過程比較容易,因為對模板幾乎沒有(或完全沒有)什麼真正的需求。對於複雜控制項,問題就顯得有些微妙了,因為控制項的外觀和實現不可能完全相互獨立的 ...
  • 效果圖預覽 新建MyCustomControl類。 public class MyCustomControl : Control { private static Storyboard MyStory; private ObjectAnimationUsingKeyFrames MyAnimatio ...
  • 在帶鍵盤滑鼠的電腦上編寫應用於觸屏電腦的項目,為了能輸入中文、英文、數字等各種庸人自擾。 一、自己畫了個鍵盤 為了實現能輸入中文,還簡單編寫了個拼音輸入法,各種折騰,始終不是很舒服。最後客戶要求手寫輸入中文,於是就完全放棄了。 二、折騰TabTip.exe win10的虛擬鍵盤是一個程式,即c:\P ...
  • 五、C#流程式控制制 5.1.if語句 1)結構 if(條件判斷表達式) { func1 }else { func2 } 5.2.switch語句 1)結構 switch(表達式) { case 常量表達式:條件語句;break; case 常量表達式:條件語句;break; case 常量表達式:條件 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...