在客戶端程序, 咱們補充一鍵登出操做.服務器
使用了idsv以後, 退出的操做須要刪除本地cookie, 而後去請求認證服務器, 也刪除認證服務器的cookie.cookie
官網給的退出的代碼async
public async Task Logout() { await HttpContext.SignOutAsync("Cookies"); await HttpContext.SignOutAsync("oidc"); }
如今一鍵登出, 會發現右側圖片的問題, 那是由於咱們沒有在認證服務器上實現登出的邏輯.ide
那麼咱們去參考(抄寫)一下quickstartui的代碼, 下面的代碼是個人簡化版本, 實現一鍵登出而且跳回去ui
[HttpGet] public async Task<ActionResult> Logout(string logoutid) { if (User?.Identity.IsAuthenticated == true) { // delete local authentication cookie await HttpContext.SignOutAsync(); //手工刪除認證cookie(原理是設置某個cookie過時), cookie名在startup中配置好了. HttpContext.Response.Cookies.Delete("identityCookieJJL"); } return Redirect(GetUrlAfterLogout(logoutid).Result); }
爲何須要手工刪除驗證服務器的cookie呢. 我也不清除, 不過目前客戶端是登出了. 可是驗證服務器仍是登陸狀態,url
查看驗證服務器的cookie, 有以下spa
這個cookiename是在startup中註冊identity的時候指定的, 代碼以下, 其實能夠去系列文章的第一篇去查看code
這樣就能夠實現一鍵登出了.blog
實際上本來的登出代碼以下圖片
/// <summary> /// 退出回調用頁面 /// </summary> [HttpPost] [ValidateAntiForgeryToken] public async Task<IActionResult> Logout(LogoutInputModel model) { var vm = await _account.BuildLoggedOutViewModelAsync(model.LogoutId); var user = HttpContext.User; if (user?.Identity.IsAuthenticated == true) { //刪除本地受權Cookies await HttpContext.SignOutAsync(); await _events.RaiseAsync(new UserLogoutSuccessEvent(user.GetSubjectId(), user.GetName())); } // 檢查是否須要在上游身份提供程序上觸發簽名 if (vm.TriggerExternalSignout) { // 構建一個返回URL,以便上游提供者將重定向回 // 在用戶註銷後給咱們。這使咱們可以 // 完成單點簽出處理。 string url = Url.Action("Logout", new { logoutId = vm.LogoutId }); // 這將觸發重定向到外部提供者,以便籤出 return SignOut(new AuthenticationProperties { RedirectUri = url }, vm.ExternalAuthenticationScheme); } return View("LoggedOut", vm); }
還有很多東西須要研究