註銷IdentityServer就像刪除身份驗證cookie一樣簡單,但是為了完成聯合註銷,我們必須考慮將用戶從客戶端應用程式(甚至可能是上游身份提供者)中簽名。 24.1 刪除認證 要刪除身份驗證cookie,只需使用 擴展方法 即可。您需要傳遞使用的方案( 除非您已更改,否則提供此方案): 或者 ...
註銷IdentityServer就像刪除身份驗證cookie一樣簡單,但是為了完成聯合註銷,我們必須考慮將用戶從客戶端應用程式(甚至可能是上游身份提供者)中簽名。
24.1 刪除認證
要刪除身份驗證cookie,只需使用HttpContext
擴展方法SignOutAsync
即可。您需要傳遞使用的方案(IdentityServerConstants.DefaultCookieAuthenticationScheme
除非您已更改,否則提供此方案):
await HttpContext.SignOutAsync(IdentityServerConstants.DefaultCookieAuthenticationScheme);
或者您可以使用IdentityServer提供的便捷擴展方法:
await HttpContext.SignOutAsync();
註意
通常,您應該提示用戶註銷(需要POST),否則攻擊者可能會鏈接到您的註銷頁面,導致用戶自動註銷。
24.2 通知客戶端用戶已註銷
作為退出流程的一部分,您需要確保客戶端應用程式被告知用戶已退出。IdentityServer支持伺服器端客戶端的前端通道規範(例如MVC),伺服器端客戶端的反向通道 規範(例如MVC),以及基於瀏覽器的JavaScript客戶端的會話管理規範(例如SPA,React,Angular)等)。
24.2.1 前端伺服器端客戶端
要通過前端通道規範從伺服器端註銷客戶端應用程式用戶,IdentityServer中的“已註銷”頁面必須呈現<iframe>
以通知客戶端用戶已註銷。希望收到通知的客戶端必須設置FrontChannelLogoutUri
配置值。IdentityServer跟蹤用戶已登錄的客戶端,並提供在IIdentityServerInteractionService
上(詳細信息)調用GetLogoutContextAsync
的API 。此API返回一個LogoutRequest
對象,該對象具有SignOutIFrameUrl
註銷您的頁面必須呈現為的<iframe>
屬性。
24.2.2 反向通道伺服器端客戶端
要通過反向通道規範從伺服器端註銷客戶端應用程式用戶,IdentityServer中的SignOutIFrameUrl
端點將自動觸發伺服器到伺服器調用,將簽名的註銷請求傳遞給客戶端。這意味著即使如果沒有前面通道的客戶端中,“退出”,在IdentityServer頁仍必須渲染<iframe>
到SignOutIFrameUrl
如上所述。希望收到通知的客戶端必須設置BackChannelLogoutUri
配置值。
24.2.3 基於瀏覽器的JavaScript客戶端
鑒於會話管理規範的設計方式,IdentityServer中沒有什麼特別的,您需要做的是通知這些客戶端用戶已註銷。但是,客戶端必須對check_session_iframe執行監視,這是由oidc-client JavaScript庫實現的。
24.3 由客戶端應用程式啟動的註銷
如果客戶端應用程式啟動了註銷,則客戶端首先將用戶重定向到結束會話端點。在結束會話端點處的處理可能需要通過重定向到註銷頁面來維護一些臨時狀態(例如,客戶端的註銷後重定向uri)。此狀態可能對註銷頁面有用,並且狀態的標識符通過logoutId參數傳遞到註銷頁面。
在GetLogoutContextAsync
上的API 交互服務可以用來載入狀態。感興趣的ShowSignoutPrompt
是ShowSignoutPrompt
指示註銷請求是否已經過身份驗證,因此不會提示用戶註銷是安全的。
預設情況下,此狀態作為通過logoutId值傳遞的受保護數據結構進行管理。如果您希望在結束會話端點和註銷頁面之間使用其他一些持久性,那麼您可以IMessageStore<LogoutMessage>
在DI中實現並註冊實現。
github地址