← 返回作品列表
個人作品
上線中
Sanring SSO
各系統共用的自建 OIDC 統一登入與帳號權限服務
內部系統,無公開網址,僅提供截圖
Sanring SSO
1 / 6重點
- 以 OpenIddict 自建 IdP,並自行實作 OIDC Back-Channel Logout,登出與停權即時跨系統生效
- 135 個測試涵蓋 50 種安全與流程情境
- CI 含 .NET 安全分析、相依弱點掃描、secret 掃描、Semgrep、Trivy 與 OWASP ZAP
背景與目標
登入、帳號與角色原本寫在官網裡,獨立成 IdP 後,多個系統共用同一套帳號;新系統接入只需註冊,不用改程式或資料表。
核心功能
- OIDC 登入:Authorization Code + PKCE、refresh token 輪替;服務帳號使用 client credentials
- 即時跨系統登出:登出只結束當前工作階段,停權則撤銷全部;通知失敗會排隊重送
- 依權限要求 MFA:有編輯權限的使用者必須綁定 TOTP 並取得備用碼,唯讀使用者免綁
- 系統與權限註冊:每個系統有自己的權限代碼與角色;使用者失去最後一個角色時自動停用
- 登入頁與帳號中心:中英雙語登入頁、Google 登入,以及 Angular 帳號中心
技術架構
- IdP
單一專案同時提供 Razor 登入頁與 Angular 帳號中心
- 帳號模型
OpenIddict 只負責協定層,帳號、角色與權限自行實作(ASP.NET Core Identity)
- 資料與部署
PostgreSQL、Redis,Docker Compose 部署
- 已接入系統
挑戰與解法
- 自建還是採購 IdP:評估後選擇自建,OpenIddict 處理協定細節,帳號與權限模型保留彈性。
- OpenIddict 沒有 Back-Channel Logout:依規格自行實作簽章的 logout token、失敗重送佇列,接收端檢查 token 識別碼防止重放。
- CSP 擋住登入轉址:加上
form-action限制後,各系統的登入轉址被阻擋,改以中介頁轉址解決。





