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

    还有不少东西需要研究

  • 相关阅读:
    新学期——扬帆起航
    我与虚拟机的爱恨情仇
    20155329胡佩伦的第二次预备作业——再思考
    课前的第一次与老师交流
    # 20155327 2016-20017-3 《Java程序设计》第3周学习总结
    20155327《Java程序设计》第二周学习总结
    20155327 2016-2017-2 《Java程序设计》第一周学习总结
    20155327第三次作业
    20155327 学习基础和C语言基础调查
    记自己的第一篇博客
  • 原文地址:https://www.cnblogs.com/jianjialin/p/9311125.html
Copyright © 2011-2022 走看看