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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...