zoukankan      html  css  js  c++  java
  • .net core Identity集成IdentityServer(3) 一键登出

    在客户端程序, 我们补充一键登出操作.

    使用了idsv之后, 退出的操作需要删除本地cookie, 然后去请求认证服务器, 也删除认证服务器的cookie.

    官网给的退出的代码

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

    imageimage

    现在一键登出, 会发现右侧图片的问题, 那是因为我们没有在认证服务器上实现登出的逻辑.

    那么我们去参考(抄写)一下quickstartui的代码, 下面的代码是我的简化版本, 实现一键登出并且跳回去

    [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呢. 我也不清除, 不过目前客户端是登出了. 但是验证服务器还是登录状态,

    查看验证服务器的cookie, 有如下

    image

    这个cookiename是在startup中注册identity的时候指定的, 代码如下, 其实可以去系列文章的第一篇去查看

    image

    这样就可以实现一键登出了.

    实际上原本的登出代码如下

    /// <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);
            }

    还有不少东西需要研究

  • 相关阅读:
    MFC框架程序实现十一
    MFC框架程序实现八
    MFC框架程序实现十二
    在Visual C++中如何利用UDL文件来建立ADO连接
    OnePage收集 HA
    微博跳转的url HA
    淘宝iosapp调用规范 HA
    Excel操作相关 HA
    C#GDI+编程基础 HA
    html5deoms HA
  • 原文地址:https://www.cnblogs.com/jianjialin/p/9311125.html
Copyright © 2011-2022 走看看