前言
學習 SAML 2.0 時整理的兩張核心流程圖,涵蓋標準 SP-Initiated SSO 與多身分提供者 (IdP) 情境,供後續查閱與團隊分享。
流程圖一:標準 SAML SSO 流程 (SP-Initiated)

關鍵步驟解析
- 用戶存取 SP:瀏覽器請求服務提供者 (SP) 受保護資源。
- SP 產生 AuthnRequest:SP 建立 SAML 認證請求 (HTTP Redirect/POST),導向 IdP。
- IdP 驗證用戶:身分提供者 (IdP) 挑戰用戶認證 (帳密、MFA、SSO Session 等)。
- IdP 回應 SAML Response:包含 Assertion (主體、屬性、條件)、簽章、加密。
- SP 驗證回應:檢查簽章、Issuer、Audience、NotBefore/NotOnOrAfter、Replay 防護。
- 建立本地 Session:SP 設定 Cookie/Token,授權用戶存取資源。
流程圖二:多 IdP 架構下的 SAML SSO

多 IdP 關鍵差異
- Discovery Service (DS) / WAYF:用戶先導向探索服務,選擇所屬 IdP (學術聯盟常見)。
- SP 需支援多 IdP 中繼資料:動態載入/快取多組 IdP 憑證與端點。
- Assertion 驗證邏輯統一:無論哪個 IdP,驗證流程 (簽章、時間、對象) 一致。
- 屬性映射策略:不同 IdP 釋出屬性格式可能不同,SP 需正規化映射。
核心 SAML 元素速查
| 元素 | 用途 |
| <AuthnRequest> | SP 發起認證請求,含 ForceAuthn、IsPassive、ProtocolBinding |
| <Response> | IdP 回應,含 Status、Assertion、Signature |
| <Assertion> | 安全斷言,核心載體:Subject、Conditions、AuthnStatement、AttributeStatement |
| <Subject> | 主體識別:NameID (持久/暫時)、SubjectConfirmation (Bearer/Holder-of-Key) |
| <Conditions> | 有效條件:NotBefore、NotOnOrAfter、AudienceRestriction |
常見坑點與對策
| 問題 | 原因 | 解決 |
| 時間偏移導致驗證失敗 | SP/IdP 伺服器時鐘不同步 | 啟用 NTP、寬容 Skew (如 3 分鐘) |
| 重放攻擊 | Assertion 被攔截重送 | SP 維護 InResponseTo/Assertion ID 去重快取 |
| 簽章驗證失敗 | 憑證過期、演算法不支援 (SHA-1 棄用) | 定期輪換 SHA-256 憑證、支援 RSA-SHA256 |
| 多 IdP 憑證管理混亂 | 手動維護 metadata | 實作 Metadata 自動同步 (定時下載/簽章驗證) |
實作建議
- 使用成熟庫:Sustainsys.Saml2 (ASP.NET Core)、ComponentSpace SAML、OpenSAML (Java)。
- 啟用 **Metadata 交換**:SP/IdP 互相發布 XML Metadata,自動同步端點與憑證。
- 採用 **HTTP POST Binding** 傳遞 Response,避免 URL 長度限制與記錄敏感資訊。
- 記錄完整 SAML 訊息 (去敏感化) 供除錯與稽核。
結語
SAML SSO 流程雖繁雜,但核心邏輯穩定:信任傳遞 + 斷言驗證。掌握兩張流程圖的關鍵節點,配合成熟庫實作,即可構建企業級聯盟身分識別系統。