.net core Identity集成IdentityServer(3) 一鍵登出

在客戶端程序, 咱們補充一鍵登出操做.服務器

使用了idsv以後, 退出的操做須要刪除本地cookie, 而後去請求認證服務器, 也刪除認證服務器的cookie.cookie

 

官網給的退出的代碼async

public async Task Logout()
        {
            await HttpContext.SignOutAsync("Cookies");
            await HttpContext.SignOutAsync("oidc");
        }

imageimage

如今一鍵登出, 會發現右側圖片的問題, 那是由於咱們沒有在認證服務器上實現登出的邏輯.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

image

這個cookiename是在startup中註冊identity的時候指定的, 代碼以下, 其實能夠去系列文章的第一篇去查看code

image

 

這樣就能夠實現一鍵登出了.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);
        }

還有很多東西須要研究

相關文章
相關標籤/搜索