注銷IdentityServer與刪除身份cookie一樣簡單,但是我們必須考慮將用戶從客戶端應用程序(甚至可能是上游身份提供程序)中注銷。
一.刪除身份認證Cookie
要刪除身證認證cookie,只需在HttpContext
的擴展方法SignOutAsync
即可。你需要傳遞一個值IdentityServerConstants.DefaultCookieAuthenticationScheme
,如果你修改了他,那么使用你自定義的值。
await HttpContext.SignOutAsync(IdentityServerConstants.DefaultCookieAuthenticationScheme);
或者
await HttpContext.SignOutAsync();
通常,你應該提示用戶注銷(意思是需要POST方式提交注銷請求),否則攻擊者可能會熱鏈接到你的注銷頁面(GET方式),導致用戶被自動注銷。
二.通知客戶端已被注銷的用戶信息
作為注銷過程的一部分,你需要確保向客戶端通知用戶已注銷。IdentityServer支持服務器應用程序(MVC Client)的 front-channel 和 back-channel,以及基於瀏覽器的JavaScript客戶端(例如SPA,React,Angular等)的session management。
Front-channel
要通過 Front-channel 從服務器端應用程序注銷用戶,IdentityServer中的“注銷”頁面必須呈現<iframe>
以通知客戶端用戶已注銷。希望被通知的客戶端必須設置 FrontChannelLogoutUri
的值。IdentityServer 跟蹤用戶登錄的客戶端,並在IIdentityServerInteractionService
上提供名為GetLogoutContextAsync
的API。該API返回一個帶有SignOutIFrameUrl
屬性的LogoutRequest
對象,所以你注銷的頁面必須呈現為\<iframe\>
。
Back-channel
通過 Back-channel 來注銷用戶,IdentityServer中的SignOutIFrameUrl
端點將自動觸發Server到Server的調用,將簽名注銷請求傳遞給客戶端。這意味着即使沒有 Front-channel ,IdentityServer中的“注銷”頁面仍然必須呈現一個<iframe>到SignOutFrameUrl
,希望收到通知的客戶端必須設置BackChannelLogoutUri
配置值
基於瀏覽器的JavaScript客戶端
參考 session management 的設計規范,IdentityServer中沒有什么特別的,您需要通知這些客戶端用戶已經退出。 但是,客戶端必須對check_session_iframe
執行監視,並且這由 oidc-client JavaScript庫實現。
三.由客戶端應用程序發起的注銷
如果注銷是由客戶端應用程序啟動的,則客戶端首先將用戶重定向到最終會話端點。 在會話結束端點進行處理可能需要通過重定向到注銷頁面來維護一些臨時狀態(例如,客戶端的注銷,注銷重定向uri)。 該狀態可能對注銷頁面有用,並且狀態的標識符通過logoutId參數傳遞到注銷頁面。
交互服務上的GetLogoutContextAsync
API可用於加載狀態。感興趣的是ShowSignoutPrompt
,它指示注銷請求是否已通過身份驗證,因此不會提示用戶注銷。
默認情況下,此狀態作為通過logoutId
值傳遞的受保護數據結構進行管理。 如果你希望在會話終端和注銷頁面之間使用其他持久性,則可以實現IMessageStore <LogoutMessage>
並在DI中注冊實現。