ASP.NET 內建 FormsAuthentication_OnAuthenticated 僅支援 Forms 認證、無登出事件、需修改 Global.asax,侷限性大。本文介紹基於 HttpModule + 雙會話表 的通用方案,支援 Forms/Windows/Passport、登入登出雙向監聽、零業務代碼侵入、Web.config 純配置。
在 HttpApplication.AcquireRequestState 事件中,維護兩張會話表:
每請求檢查當前 Session 所在表,對比 HttpContext.User.Identity.IsAuthenticated 真實狀態:
| 狀態 | 判定邏輯 | 動作 |
|---|---|---|
| 新會話 (兩表皆無) | 首次請求 | 調用所有 SSO Provider 驗證,若任一通過 → 移入已認證表,通知訂閱者 |
| 已認證表中 | 預期已登入 | 若實際未認證 → 移入未認證表,通知登出 |
| 未認證表中 | 預期未登入 | 若實際已認證 → 移入已認證表,通知登入 |
IConfigContext:配置參數上下文。ISSOProvider:SSO 提供者介面,兼做狀態變更 Handler (登入/登出通知)。IHandlerFactory:Handler 工廠,控制實例化時機與構造自由度。全部透過 web.config 註冊,業務層零感知,Global.asax 零修改。
此方案將認證狀態感知從「硬編碼耦合」升級為「可配置、可擴展、透明無感」的基礎設施能力。