.net core Identity集成IdentityServer(3) 一键登出
在客户端程序, 我们补充一键登出操作.
使用了idsv之后, 退出的操作需要删除本地cookie, 然后去请求认证服务器, 也删除认证服务器的cookie.
官网给的退出的代码
public async Task Logout()
{
await HttpContext.SignOutAsync("Cookies");
await HttpContext.SignOutAsync("oidc");
}


现在一键登出, 会发现右侧图片的问题, 那是因为我们没有在认证服务器上实现登出的逻辑.
那么我们去参考(抄写)一下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, 有如下

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

这样就可以实现一键登出了.
实际上原本的登出代码如下
/// <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);
}
还有不少东西需要研究
.net core Identity集成IdentityServer(3) 一键登出的更多相关文章
- .net core Identity集成IdentityServer(2) 实现IprofileService接口在accesstoken中增加自定义claims
导读 1. 如何添加自定义的claims. 前请提要 目前我们拥有了三个web应用. localhost:40010, 验证服务器 localhost:40011, mvc客户端, 充当webapp请 ...
- .net core Identity集成IdentityServer4 (1)基本操作
一. 新建asp.net core identity项目 新建项目->asp.net core web应用程序-> web应用程序(模型视图控制器)&更改身份验证为个人. 新建一个 ...
- .net core identity集成微信授权登录
最快的方式是直接nuget安装AspNetCore.Authentication.WeChat包. 想要知道是如何实现的,可以看下面github上面的源码. 源码在这里:https://github. ...
- IdentityServer4【Topic】之登出
Sign-out 登出 IdentityServer的登出就像删除认证cookie一样简单,但是为了完成一个完整的联合签名,我们必须考虑将用户从客户端应用程序中(甚至可能是上游的Identity提供者 ...
- 从零搭建一个IdentityServer——集成Asp.net core Identity
前面的文章使用Asp.net core 5.0以及IdentityServer4搭建了一个基础的验证服务器,并实现了基于客户端证书的Oauth2.0授权流程,以及通过access token访问被保护 ...
- IdentityServer(12)- 使用 ASP.NET Core Identity
IdentityServer具有非常好的扩展性,其中用户及其数据(包括密码)部分你可以使用任何想要的数据库进行持久化. 如果需要一个新的用户数据库,那么ASP.NET Core Identity是你的 ...
- Identity和IdentityServer的区别及联系
关于Identity和IdentityServer初学的时候可能会有一些疑惑(虽然我也不是很精深吧),但是,这里说一下自己关于这两者的一些理解,如有错误,欢迎指正 总体上, ASP.NET Core ...
- 从零搭建一个IdentityServer——会话管理与登出
在上一篇文章中我们介绍了单页应用是如何使用IdentityServer完成身份验证的,并且在讲到静默登录以及会话监听的时候都提到会话(Session)这一概念,会话指的是用户与系统之间交互过程,反过来 ...
- 第16章 使用ASP.NET Core Identity - Identity Server 4 中文文档(v1.0.0)
注意 对于任何先决条件(例如模板),首先要查看概述. IdentityServer旨在提供灵活性,其中一部分允许您为用户及其数据(包括账户密码)使用所需的任何数据库.如果您从新的用户数据库开始,那么A ...
随机推荐
- Leetcode(二)两数相加
两数相加 题目描述 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链 ...
- JavaScript复习笔记——数据类型
1.undefined 使用var声明但未对其进行初始化时,这个变量的值就是undefined. 对未被初始化的值使用typeof会返回undefined值,而对未声明的变量执行typeof操作同样也 ...
- vue组件通信新姿势
在vue项目实际开发中我们经常会使用props和emit来进行子父组件的传值通信,父组件向子组件传递数据是通过prop传递的, 子组件传递数据给父组件是通过$emit触发事件来做到的.例如: Vue. ...
- js读取txt文件
$('#selectAreaFile').on('change',function(e){//用户区域的文件选择 var files=e.target.files; if ...
- mysql的一点小错误
当使用sql语句时,字段记得使用``反向单引号,而不是单引号
- Android学习笔记(2):build.grandle的常用设置
1 > java开发中有两个大名鼎鼎的项目构建ANT.Maven. 2 > Google推荐使用的Android Studio是采用Gradle来构建项目的.Gradle是一个非常先进的项 ...
- Java实现链表的常见操作算法
链表分为单链表,双向链表和循环链表,是一种链式存储结构,由一个个结点链式构成,结点包含数据域和指针域,其中单链表是只有一个指向后驱结点的指针,双向链表除头结点和尾结点外,每个结点都有一个前驱指针和一个 ...
- 每天学点SpringCloud(五):如何使用高可用的Eureka
前几篇文章我们讲了一下Eureka的基础使用,但是呢有一个很重要的问题,我们讲的都是单机版的情况,如果这个时候Eureka服务挂了的话,那么我们的服务提供者跟服务消费者岂不是都废了?服务提供者和消费者 ...
- Java核心技术卷一基础知识-第12章-泛型程序设计-读书笔记
第12章 泛型程序设计 本章内容: * 为什么要使用泛型程序设计 * 定义简单泛型类 * 泛型方法 * 类型变量的限定 * 泛型代码和虚拟机 * 约束与局限性 * 泛型类型的继承规则 * 通配符类型 ...
- springbean的生命周期
1.Spring对Bean进行实例化(相当于程序中的new Xx())2.Spring将值和Bean的引用注入进Bean对应的属性中3.如果Bean实现了BeanNameAware接口,Spring将 ...