首页 程序笔记 谈谈SSO单点登录的设计实现

谈谈SSO单点登录的设计实现

其实单点登录在我们生活中很常见,比如学校的网站,有很多个系统,迎新系统,教务系统,网课系统。我们往往只需要登录一次就能在各个系统中被认定为登录状态。

这是怎么实现的?我们需要一个认证中心,一如学校网站也有一个统一认证中心,也就是我们的SSO的Server端。在每个系统也就是Client端,我们只要判断已经在这个认证中心中登录,那我们就会被设置为登录状态。

再来就是最后一个问题了,我们判断在认证中心登录后,怎么在其他系统中也登录?

这个问题其实就是单点登录中最麻烦的问题了,也就是如何传播我们的登录状态。

我们可以分为两个情况Cookie共享传播状态,url参数传播状态。

Cookie共享传播状态

第一种情况:我们的认证中心和其他系统是在一个域名下的,认证中心为父域名(jwxt.com),其他系统是子域名(yx.jwxt.com),或者是同一IP不同端口的情况,我们的服务端通过cookie去判断是否登录。

在这种情况下我们只要在认证中心登录成功的时候设置Cookie,当然设置Cookie的时候也要注意设置好你的Cookie参数。

要注意设置的参数是dominpath。这两个参数值决定了Cookie的作用域。domin要设置为父域名(.jwxt.com)。当然还要注意一个SameSite参数,不能设置为None。(如果为None,你在baidu.com登录,在example.com网站如果你点击了 https://baidu.com/delete 链接,会带着你在baidu.com的Cookie访问。)

设置完Cookie,子域名的系统也有了Cookie,自然就会被服务端判断为登录状态。

简而言之,就是利用Cookie共享来实现登录状态的传播。

url参数传播状态

第二种我们的认证中心和其他系统不在一个域名下的,或者是不同IP的情况。

为了安全浏览器限制cookie跨域,也就是说第一种方法就不管用了。

这种情况可以通过传播参数来实现,也就是在认证中心登录后带着 登录凭证(token) 重定向到对应的Client页面,然后我们的前端就可以用js获取到url中的token进行存储(设置到Cookie或者localstorage等方式),之后我们的服务端只需要通过这个token就可以判断为登录状态了。

当然,为了安全我们往往不会直接传递凭证,而是传递一个校验码ticket,然后前端发送ticket到服务端校验ticket,校验成功,就进行登录,设置Cookie或者存储token。

1|2流程

接下来我们梳理一下流程,一下Client为需要单点登录的系统,Server为统一认证中心。

Cookie共享传播状态

  1. 用户在Client1,如果没有登录,跳转到Server,判断在Server是否登录,如果判断没有登录,要求登录,登录成功后设置Cookie,跳转Client
  2. Client1登录成功

如果之后在Client2页面,由于共享Cookie,当然也是登录状态。

url参数传播状态

  1. 用户在Client1,判断没有登录,跳转到Server,判断在Server是否登录,如果没有登录,要求登录,登录成功后设置Cookie,带着ticket跳转Client。
  2. 到了Client1,前端通过参数获取到ticket,发送到服务端,服务端校验ticket获取登录id,设置Cookie进行登录。

之后在Client2页面

  1. 用户在Client2,判断没有登录,跳转到Server,判断在Server是否登录,这时候判断为登录,带着ticket(或者token)跳转Client。
  2. 到了Client2,前端通过参数获取到ticket,发送到服务端,服务端校验ticket获取登录id,设置Cookie进行登录。

如果不使用ticket校验就直接存储传播过来的登录凭证即可,当然如果你不存储到Cookie,记得在请求后端服务的时候带上token。

ticket校验

再说说ticket校验

ticket校验根据情况也可以分为两种,一种情况是Server和Client的后端共用的同一个Redis或者Redis集群,可以直接向Redis请求校验。如果后端用的Redis不同,可以发送http请求到Server端在Server端校验。

到此,单点登录就完成了。

当然在以上描述中的Cookie你也可以不使用,使用Cookie主要是方便,在请求后端时会自动发送。你只需要存储到localstorage/sessionstorage等地方,请求后端的时候记得get然后带上即可。

转载至https://www.cnblogs.com/weloe/p/17812051.html

3

站星网

其实单点登录在我们生活中很常见,比如学校的网站,有很多个系统,迎新系统,教务系统,网课系统。我们往往..

为您推荐

使用 html2canvas 实现截图功能

html2canvas 是一个开源的 JavaScript 库,用于将网页上的 HTML 元素渲染成图像。它通过遍历页面的 DOM 树和计算样式,然后将其绘制到 <canvas> 元素上,最终生成图片。该库不依赖服务器端,而是通过浏览器端的 Java..

网站统计中的访问信息收集的前端实现

网站数据统计分析工具是网站站长和运营人员经常使用的一种工具,比较常用的有谷歌分析、百度统计和腾讯分析等等。所有这些统计分析工具的第一步都是网站访问数据的收集。目前主流的数据收集方式基本都是基于javascri..

使用SuperWebSocket实现Web消息推送

在大部分Web系统中,我们可能遇到需要向客户端推送消息的需求。SuperWebSocket第三方库能让我们轻松的完成任务。SuperWebSocket第三方库可以从网上下载,不过通过Visual Studio Nuget安装更快。引用SuperWebSocket相..

.NET C# 使用Hook钩子实现全局监听键盘和鼠标

C# 是一种面向对象的编程语言,具有丰富的类库和工具支持,适用于各种类型的应用程序开发。Windows 提供了一种称为"钩子"(Hook)的机制,允许拦截并处理系统级别的事件,如键盘按键和鼠标移动。通过结合 C# 和 Hook..

.NET C#连接FTP实现文件上传下载

在 .NET 中可以使用 System.Net.FtpWebRequest 类来连接 FTP 服务器,实现文件上传和下载。以下是实现文件上传和下载的完整代码示例。1. 上传文件到 FTP 服务器using System;using System.IO;using System.Net;class..

C#使用 Attribute 实现 AOP 功能

在 C# 中,通过自定义 Attribute 并结合一些技术(如动态代理、反射等)可以实现 AOP(面向切面编程)。AOP 通常用于日志记录、性能监控、权限验证等横切关注点。以下是一个使用 C# Attribute 实现 AOP 功能的示例。..

使用CSS columns-visibility实现砌体布局

CSS的 columns 属性(如 columns、column-count 和 column-width)通常用于多列文本布局,而不是直接用于砌体布局。然而,结合 columns 和 visibility 属性,可以在某些情况下实现类似砌体布局的效果,虽然它并不完..

多语言网站数据库文章表设计

设计一个支持多语言的网站数据库时,应该确保内容能够方便地扩展和管理。以下是多语言数据库表设计的关键原则和示例:设计原则分离内容与语言:将与语言相关的内容独立存储,不直接硬编码到主要表中。每个支持多语言..

ASP.NET MVC最常用的设计模式代码示例

ASP.NET MVC 是一个基于分层架构的框架,其核心架构本身已经实现了 MVC 模式(Model-View-Controller)。除了 MVC 模式,开发者在使用 ASP.NET MVC 开发应用时,通常会结合其他设计模式以提高代码的可维护性、可扩展..

微软 .NET 9 正式发布!专为云原生和生成式 AI 应用设计

微软正式发布了 .NET 9,这是一次重大的版本更新。微软在 .NET 9 中带来了一系列新特性和改进,主要聚焦在性能优化、云原生支持、AI集成以及开发者体验的提升。以下是一些重要的更新亮点:性能改进:在 .NET 9 中,..

设计模式之高质量代码

0,什么是高质量代码我觉得回答这个问题,应该从两个方面考虑。从业务角度考虑。首先,在公司开发一款软件,应该是业务在驱动。所以,从这个角度来说,代码第一个应该满足的是业务需求,如果连最基本的业务需求都满..

js使用IntersectionObserver实现锚点在当前页面视口时导读高亮

在 JavaScript 中可以通过监听页面滚动事件,检查每个锚点的位置,并根据当前滚动位置高亮相应的导航项,从而实现页面内锚点链接的导读高亮效果。交叉观察器 API(Intersection Observer API)提供了一种异步检测目..

js使用scroll事件实现锚点滚动到页面顶部时导航高亮

在 JavaScript 中,可以通过监听页面滚动事件,并判断页面顶部与各个锚点的距离来实现导航高亮效果。当某个锚点的内容块滚动到页面顶部时,自动高亮相应的导航项。以下是实现方式:1. HTML 结构假设我们有多个内容区..

前端CSS常见的三种设计模式

CSS设计模式主要包括OOCSS、SMACSS和BEMCSS等。以下是对这些模式的具体介绍:OOCSS:面向对象的CSS,旨在编写高可复用、低耦合和高扩展的CSS代码。它将抽象(结构)和实现(样式)分离,抽离公共代码,以提高代码的..

ASP.NET Core实现多语言本地化Web应用程序

构建全球可访问的网站和应用程序需要对内容进行适当的本地化,以吸引来自不同文化和地区的用户。ASP.NET Core 提供强大的本地化支持,以用户首选的语言和格式呈现内容。在本综合指南中,我们将探索 ASP.NET Core 中..

支付宝第三方支付平台对接原理和实现

如果把商户网站使用第三方支付平台(比如支付宝)的原理搞清楚,那编程就变得简单多了。 整个过程大致这样: 1、商户与支付宝签约。 2、在商户网站购买商品,填写数量,确定购买后跳转到结账页面。结账页面可能包括订..

类似php iconv的函数功能,C#实现方法

在与一个第三方接口对接时,发现对方无法用GZip解压我发过去的数据,看了对方PHP的示例代码,发现对方使用的是PHP的$file = iconv("IOS-8859-1","UTF-8",gzencode($data_json));大致意思是要先压缩,在把压缩的数组..

c#实现与Java无差异的GZip压缩和GZip解压缩

c#实现与Java无差异的GZip压缩和GZip解压缩,其中有个坑就是GZip压缩的时候,只有在GZipStream在Dispose后调应对应MemoryStream.ToArray()所得到的结果才是正确的压缩数据。如果在zipStream.Write(bytes, 0, bytes.L..

.NET Core 管道模型中间件及管道模拟实现

管道,PipelineASP.NET Core 路由,认证,绘画,缓存,都是由管道来处理的中间件。MVC WEB API,都是建立在某个特殊的中间件之上。MVC,路由的中间件,请求地址和控制器之间的映射,在此基础上实现了实例化控制器,..

Linq to Object的Where和Select实现原理

Linq的Where是一个基于委托的代码封装,把数据筛选的通用逻辑完成,把判断逻辑交给委托传递。Select是基于委托的代码封装,把数据转换的通用逻辑完成,把转换逻辑交给委托传递。Linq还有很多方法,这些方法大多都是..

发表回复

返回顶部

微信分享

微信分享二维码

扫描二维码分享到微信或朋友圈

链接已复制
塔尊佛教网|借视频之舟,渡烦恼之海 Tazun.Cn佛教音乐网 - 海量佛乐、梵呗、禅音在线试听与下载经书网 - 以音声作佛事,聆听与观想的修学园地 jingshu.net佛教导航 - 开启智慧之旅,连接十方法缘 | fjdh.org.cn智慧莲华 - 赋能寺院数字化升级,打造智慧弘道平台趣知道 - 提问与分享,人人都是知识分享家 | Quzhidao.Com地藏孝亲网--南无大愿地藏王菩萨给农网地藏经顺运堂 - 专业家居风水布局,八字命理分析,助您家宅兴旺,运势亨通弘善佛教网-传播正信正知佛法的佛教网站国学在线 - 国学网,国学学校,国学经典,国学地图品读名篇佳句,涵养诗意人生 - 古诗词网哦嘿养殖网 - 热门乡村养殖发展项目_养殖技术知识分享生死书 - 佛教文化传承与生命智慧探索平台地藏论坛-佛教网络净土_佛法综合社区生死书生死书