位置: IT常识 - 正文

单点登录(SSO)(单点登录sso原理)

编辑:rootadmin
单点登录(SSO) 单点登录(SSO)什么是单点登录?单点登录的来源单点登录技术实现Cookie的属性详细介绍Koa Cookie 的设置与获取利用Node.js koa异步中间件——用户登录验证拦截器什么是单点登录?

推荐整理分享单点登录(SSO)(单点登录sso原理),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:单点登录sso 解决方案厂商,单点登录sso实现,单点登录sso和oauth,单点登录sso实现,单点登录sso实现,单点登录sso原理,单点登录sso的实现原理,单点登录sso 解决方案厂商,内容如对您有帮助,希望把文章链接给更多的朋友!

单点登录(Single Sign On,简称SSO)

背景: 以前的时候,一般我们就单系统,所有的功能都在同一个系统上。 后来,我们为了合理利用资源和降低耦合性,于是把单系统拆分成多个子系统。比如阿里系的淘宝和天猫,很明显地我们可以知道这是两个系统,但是你在使用的时候,登录了天猫,淘宝也会自动登录。 如图所示,图中有4个系统,分别是Application1、Application2、Application3、和SSO。Application1、Application2、Application3没有登录模块,而SSO只有登录模块,没有其他的业务模块,当Application1、Application2、Application3需要登录时,将跳到SSO系统,SSO系统完成登录,其他的应用系统也就随之登录了。这完全符合我们对单点登录(SSO)的定义。

简单来说,单点登录就是在多个系统中,用户只需一次登录,各个系统即可感知该用户已经登录。

单点登录的来源

1、早期web单系统应用

早期web单系统应用,用户的登录以及权限就显得十分简单,当浏览器向服务器发送登录请求时,验证通过之后,会将用户信息存入seesion中,然后服务器会生成一个sessionId放入cookie中,随后返回给浏览器。

验证登录的这个会话就是session,维护了用户状态,也就是所谓的HTTP有状态协议,我们经常可以在浏览器中看到JSESSIONID,这个就是用来维持这个关系的key。

2、分布式集群部署

由于网站的访问量越来也大,单机部署已经是巨大瓶颈,所以才有了后来的分布式集群部署。如果引入集群的概念,单应用可能重新部署在3台tomcat以上服务器,使用nginx来实现反向代理。

但是增加新的服务器之后,不同的服务器之间的sessionId是不一样的,可能在A服务器上已经登录成功了,能从服务器的session中获取用户信息,但是在B服务器上却查不到session信息,只好退出来继续登录,结果A服务器中的session因为超时失效,登录之后又被强制退出来要求重新登录。

所以不得不考虑多服务器之间的session数据一致的问题,这就是单点登录的最早来源。

单点登录技术实现

单点登录的本质就是在多个应用系统中共享登录状态,如果用户的登录状态是记录在 Session 中的,要实现共享登录状态,就要先共享 Session。

所以实现单点登录的关键在于,如何让 Session ID(或 Token)在多个域中共享。

1、同域下的单点登录

一个企业一般情况下只有一个域名,通过二级域名区分不同的系统。比如我们有个域名叫做:a.com,同时有两个业务系统分别为:app1.a.com和app2.a.com。我们要做单点登录(SSO),需要一个登录系统,叫做:sso.a.com。

实现方式: 在sso.a.com中登录了,其实是在sso.a.com的服务端的session中记录了登录状态,同时在浏览器端(Browser)的sso.a.com下写入了Cookie。那么我们怎么才能让app1.a.com和app2.a.com登录呢?这里有两个问题:

Cookie是不能跨域的,我们Cookie的domain属性是sso.a.com,在给app1.a.com和app2.a.com发送请求是带不上的。sso、app1和app2是不同的应用,它们的session存在自己的应用内,是不共享的。

那么我们如何解决这两个问题呢?

sso登录以后,可以将Cookie的 domian 域设置为顶域,即.a.com,这样所有子域的系统都可以访问到顶域的Cookie。在设置Cookie时,只能设置顶域和自己的域,不能设置其他的域。把3个系统的Session共享,共享Session的解决方案有很多,例如:Spring-Session单点登录(SSO)(单点登录sso原理)

2、跨域下的单点登录

如果是不同域呢?不同域之间Cookie是不共享的,怎么办?

这里我们就要说一说CAS流程了,这个流程是单点登录的标准流程。

具体流程如下:

1)用户访问app系统,app系统是需要登录的,但用户现在没有登录。 2)跳转到CAS server,即SSO登录系统,以后图中的CAS Server我们统一叫做SSO系统。 SSO系统也没有登录,弹出用户登录页。 3)用户填写用户名、密码,SSO系统进行认证后,将登录状态写入SSO的session,浏览器(Browser)中写入SSO域下的Cookie。 4)SSO系统登录完成后会生成一个ST(Service Ticket),然后跳转到app系统,同时将ST作为参数传递给app系统。 5)app系统拿到ST后,从后台向SSO发送请求,验证ST是否有效。 6)验证通过后,app系统将登录状态写入session并设置app域下的Cookie。

至此,跨域单点登录就完成了。以后我们再访问app系统时,app就是登录的。接下来,我们再看看访问app2系统时的流程。

1)用户访问app2系统,app2系统没有登录,跳转到SSO。 2)由于SSO已经登录了,不需要重新登录认证。 3)SSO生成ST,浏览器跳转到app2系统,并将ST作为参数传递给app2。 4)app2拿到ST,后台访问SSO,验证ST是否有效。 5)验证成功后,app2将登录状态写入session,并在app2域下写入Cookie。

这样,app2系统不需要走登录流程,就已经是登录了。SSO,app和app2在不同的域,它们之间的session不共享也是没问题的。

Cookie的属性详细介绍name 名称,一旦创建,名称便不可更改value 值,如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码maxAge 失效的时间,单位秒。正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为-1。signed 所请求的cookie应该被签名expires cookie 过期的 Datepath cookie 路径, 如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”。默认是’/’,domain cookie 域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。secure 是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false。httpOnly 设置为true,则服务器可访问 cookie, 浏览器js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击。默认是 trueoverwrite 一个布尔值,表示是否覆盖以前设置的同名的 cookie (默认是 false). 如果是 true, 在同一个请求中设置相同名称的所有 Cookie(不管路径或域)是否在设置此Cookie 时从 Set-Cookie 消息头中过滤掉。comment 用处说明

更多开发细节说明

从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断Cookie是否过期。

Cookie的修改、删除

Cookie并不提供修改、删除操作。如果要修改某个Cookie,只需要新建一个同名的Cookie,添加到response中覆盖原来的Cookie。

注意:修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。

Koa Cookie 的设置与获取

1、Koa 设置 Cookie

ctx.cookies.set(name, value, [options])

eg:以刷新’/'自动设置一个 Cookie 为例:./routes/index.js:

const router = require('koa-router')()router.get('/', async (ctx, next) => { ctx.cookies.set('mycookie', Math.random()) await ctx.render('index', { title: 'Hello Koa 2!' })})module.exports = router

eg:设置domain域名

2、Koa 获取 Cookie

ctx.cookies.get(name, [options])

eg:以刷新’/json’自动获取 Cookie 为例:./routes/index.js:

const router = require('koa-router')()router.get('/json', async (ctx, next) => { ctx.body = { title: 'koa2 json', cookie: ctx.cookies.get('mycookie') }})module.exports = router利用Node.js koa异步中间件——用户登录验证拦截器// 用户信息认证中间件const authMiddleware = async (ctx, next) => { const headers = ctx.headers const id = ctx.cookies.get('userId') const param = ctx.request.query // 是否已登录 if (id !== undefined) { return next() } // 如果是同步请求,并且携带了ticket(是单点登录跳转过来) if (!headers['is-xhr'] && param.ticket) { await new Promise((resolve, reject) => { http.get(`http://www.sso.com/authTicket?ticket=${param.ticket}`, function (data) { let str = ""; data.on("data", function (chunk) { str += chunk; // 监听数据响应,拼接数据片段 }) data.on("end", function () { const res = JSON.parse(str) if (res.code === 200) { ctx.cookies.set('userId', 1) ctx.response.status = 302 ctx.response.set({ Location: `http://${ctx.request.header.host}` }) resolve() } }) }) }) } ctx.response.body = { code: 302, data: { url: `http://www.sso.com?service=${ctx.request.header.host}${ctx.request.url}` } };}app.use(authMiddleware)
本文链接地址:https://www.jiuchutong.com/zhishi/297346.html 转载请保留说明!

上一篇:警惕!建信信托暴雷,是否欺骗用户?(建信信托介绍)

下一篇:【Python】Python寻找多维数组(numpy.array)中最大值的位置(行和列)(python中的查找函数)

  • 华为nova7是否支持nfc功能呢(华为Nova7是否支持频段)

    华为nova7是否支持nfc功能呢(华为Nova7是否支持频段)

  • iPhone11屏幕分辨率(iphone11屏幕分辨率是2k吗)

    iPhone11屏幕分辨率(iphone11屏幕分辨率是2k吗)

  • 腾讯会议有观看记录吗(腾讯会议有观看人数限制吗)

    腾讯会议有观看记录吗(腾讯会议有观看人数限制吗)

  • 华为路由器ipv6是什么意思啊(华为路由器IPV6防火墙)

    华为路由器ipv6是什么意思啊(华为路由器IPV6防火墙)

  • 手机外放没有声音但是耳机有声(手机外放没有声音修理多少钱)

    手机外放没有声音但是耳机有声(手机外放没有声音修理多少钱)

  • 显示器显示nosignal是什么(显示器显示nosignal)

    显示器显示nosignal是什么(显示器显示nosignal)

  • 苹果x怎么设置不接听陌生电话(苹果x怎么设置呼叫转移其他号码)

    苹果x怎么设置不接听陌生电话(苹果x怎么设置呼叫转移其他号码)

  • mac电脑语音对方听不到(mac语音通话没有声音)

    mac电脑语音对方听不到(mac语音通话没有声音)

  • 天猫精灵方糖连不上网(天猫精灵方糖连接扫地机器人)

    天猫精灵方糖连不上网(天猫精灵方糖连接扫地机器人)

  • qq可能想认识的人是相互的吗(qq可能想认识的人怎么关闭)

    qq可能想认识的人是相互的吗(qq可能想认识的人怎么关闭)

  • 办5g套餐需要换卡吗(办5g套餐需要换5g卡吗)

    办5g套餐需要换卡吗(办5g套餐需要换5g卡吗)

  • iphone11怎么装卡(iphone11怎么装手机卡)

    iphone11怎么装卡(iphone11怎么装手机卡)

  • 华为手机系统更新在哪里找(华为手机系统更新关闭)

    华为手机系统更新在哪里找(华为手机系统更新关闭)

  • 电信卡hd啥意思(电信卡上hd什么意思)

    电信卡hd啥意思(电信卡上hd什么意思)

  • 微信能发30分钟视频吗(微信能发30分钟的录音吗)

    微信能发30分钟视频吗(微信能发30分钟的录音吗)

  • wadl的大文件可以删除吗(dae文件太大怎么办)

    wadl的大文件可以删除吗(dae文件太大怎么办)

  • 怎么拒收拼多多短信(怎么拒收拼多多快递包裹已经放驿站了)

    怎么拒收拼多多短信(怎么拒收拼多多快递包裹已经放驿站了)

  • ai图片修复方法(ai修复软件)

    ai图片修复方法(ai修复软件)

  • foreach和map的区别(foreach 和 map)

    foreach和map的区别(foreach 和 map)

  • 苹果x测量仪在哪里(iphonex测量仪怎么用)

    苹果x测量仪在哪里(iphonex测量仪怎么用)

  • 手机远程关闭家里网络(手机远程关闭家里的电视机)

    手机远程关闭家里网络(手机远程关闭家里的电视机)

  • 电脑玩网络游戏报错怎么办?有什么办法解决吗?(电脑玩网络游戏一小时多少流量)

    电脑玩网络游戏报错怎么办?有什么办法解决吗?(电脑玩网络游戏一小时多少流量)

  • 在玉兰种植园里盛开的杜鹃花,南卡罗来纳州查尔斯顿 (© Joanne Wells/Danita Delimont)(玉兰种院子什么方位)

    在玉兰种植园里盛开的杜鹃花,南卡罗来纳州查尔斯顿 (© Joanne Wells/Danita Delimont)(玉兰种院子什么方位)

  • 缴纳代扣个人所得税分录
  • 抄税是什么意思谁做的事情
  • 增值税发票税率13%怎么回事
  • 销售货物提供运输是否分别核酸的例题
  • 分公司撤销跨区域转固定资产到总公司
  • 取得预收租金应如何申报缴税
  • 应交增值税减免税款怎么结转
  • 发票领回来了怎么读入发票
  • 营改增后电力行业非正常损失怎么做会计处理?
  • 1元转让股权账务实
  • 个体户交税起征点 2023年
  • 早教加盟需要
  • 事业编年底
  • 企业为什么会成为非正常户
  • 现金折扣税务会计
  • 期望和方差的计算例题
  • 高新技术企业资格复核
  • 金蝶核算项目明细表
  • 如何在Win11上查看所有用户帐户
  • 查看修改
  • 公司基本户注销流程
  • 房产税的征收范围为
  • 笔记本如何刷新bios
  • 企业办理银行结汇流程
  • 收到税务汇算清缴怎么办
  • 其他业务成本的意思
  • 居民企业境外所得税率
  • layui 日期控件赋值
  • element ui 左侧导航
  • 税务函调异常怎么处理
  • 请假扣款怎么做账
  • 出口抵减内销产品应纳税额怎么结转
  • 临时工享受的福利有哪些
  • 民间非营利组织包括哪些单位
  • 长期待摊费用的账务处理
  • 织梦遍历栏目描述
  • 按月计提固定资产折旧算收入吗
  • 批处理命令在windows操作中的典型应用
  • 用房子贷款印花税怎么算
  • 工业企业的会计核算程序
  • 什么是住房补贴,住房补贴如何办理?
  • 待报解啥意思
  • 小型微利企业企业所得税如何计算
  • 小规模减免的附加税怎么做账
  • 建筑施工安全费用提取标准
  • 小规模企业应交税费二级科目
  • 初次申报出口退税可能会遇到哪些问题
  • 施工企业开专票还是开普票好
  • 投资性房地产收回自用
  • 年限平均法计提折旧怎么算
  • 基于Sql Server通用分页存储过程的解决方法
  • sqlmap 提权
  • 苹果mac共享改名
  • linux的tar命令详解
  • 2021图解
  • windows10预览版怎么样
  • win7桌面图标变成了lnk
  • linux怎么分盘
  • win10系统怎么新建磁盘
  • linux shell命令大全
  • win7无法远程桌面win10
  • linux的简单使用
  • thinkpade431升级内存多大好
  • 菜单按钮是什么
  • android openconnect
  • js创建对象的三种方式区别
  • Cocos2dx -lua QuickXDev拓展
  • 谈一谈js消息机制的理解
  • npm安装插件失败
  • Android In <declare-styleable> MenuView, unable to find attribute android:preserveIconSpacing
  • Android shape画圆
  • css美化表单 案例
  • unity设置窗口位置
  • pyqt用法
  • 并行 python
  • jQuery模仿阿里云购买服务器选择购买时间长度的代码
  • js定义数据类型
  • 国税局国家公务员工资待遇
  • 土地增值税旧房转让计算方法
  • 纳税申报期过了怎么处理
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设