单点登录SSO(Single Sign On)就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。

实现单点登录就是要解决的几个关键问题:

  1. 存储信任
  2. 验证信任
  3. 销毁信任

通过cookie实现

只而通过cookie作为媒介实现单点登录是最简单的一种实现方法。用户登录父应用后,父应用返回一个加密的cookie(放在根域名下),当用户访问子应用的时候会带上这个cookie。

子应用会对这个cookie进行解密和校验,校验通过则登录当前用户。

这种方法存在两个问题,第一个是cookie可能被泄露,虽然可以加密,但是仍有一定风险。第二个问题时不能实现跨域登录,只能在父子应用之间实现。所以这种方法一般不会单独使用。

通过JSONP实现

在父应用中登陆后,父应用将带有登陆信息的cookie会存到客户端的父应用域名下。

当用户需要登陆子应用的时候,授权子应用访问父应用提供的用于验证登陆信息的JSONP等接口,子应用获得授权后会向父应用发起跨域请求,并带上父应用域名下的cookie。

父应用接收到请求后,验证cookie,获取用于的登陆状态,返回加密的信息给子应用,子应用通过解析返回来的加密信息来专验证用户,如果通过验证则会登陆用户。

这种方式能够解决跨域登陆的问题,但是安全性也有一定隐患,如果加密算法被泄露,那么攻击者可以在本地按照加密算法来伪造父应用的响应请求。子应用受到响应后一样可以通过验证登陆用户。

通过页面重定向实现

通过父应用和子应用来回重定向进行通信,实现信息的安全传递。父应用提供一个GET方式的登陆接口,用户通过子应用重定向的方式访问这个接口。如果用户没有登陆,则返回登陆页面,用户输入账号密码进行登陆。如果已经登陆了,则生成加密的Token,并且重定向到子应用的验证Token的接口,通过解密和校验后,子应用登陆当前用户。

这种方式的安全性更高,并且可以解决跨域登陆的问题,但是复杂性相对较高。目前采取这种方式实现单点登陆的例子已经非常多了,

京东的单点登陆实现

京东的单点登陆是通过跨域设置cookie实现SSO单点登录(2018)。

(1)首先点击登录按钮,页面跳转至京东登录中心,https://passport.jd.com/new/login.aspx?ReturnUrl=https%3A%2F%2Fwww.jd.com%2F, 登录之后验证通过跳转至returnUrl对应的地址,即京东首页

(2)首页通过jQuery的getJSON方法发起对https://passport.jd.com/loginservice.aspx(2019.10此API更新为https://passport.jd.com/new/helloService.ashx?pin=****&uuid=****&callback=jsonpHelloService&_=****)的跨域请求,获取需要跨域设置登录cookie的页面列表,返回值是JSON数据

{"nick": "****","sso": ["//sso.jd.com/setCookie?t=sso.jcloud.com&callback=?","//sso.jd.com/setCookie?t=sso.jd.hk&callback=?","//sso.jd.com/setCookie?t=sso.yiyaojd.com&callback=?","//sso.jd.com/setCookie?t=sso.jdpay.com&callback=?","//sso.jd.com/setCookie?t=sso.baitiao.com&callback=?","//sso.jd.com/setCookie?t=sso.jdwl.com&callback=?","//sso.jd.com/setCookie?t=sso.toplife.com&callback=?","//sso.jd.com/setCookie?t=sso.tjjt360.com&callback=?","//sso.jd.com/setCookie?t=sso.jdcloud.com&callback=?","//sso.jd.com/setCookie?t=sso.paipai.com&callback=?","//sso.jd.com/setCookie?t=sso.jkcsjd.com&callback=?"],"info": "<a href=\"//home.jd.com\" target=\"_blank\" class=\"link-user\">****</a>&nbsp;&nbsp;<a href=\"https://passport.jd.com/uc/login?ltype=logout\" class=\"link-logout\">退出</a>"
}

(3)首页的JS脚本会遍历SSO这个对象,对每个地址发送跨域的JSONP登陆请求(例如:https://sso.jd.com/setCookie?t=sso.jdcloud.com&callback=?):

(4)请求的响应结果中没有实质的响应对象,头信息的响应码是302,所以浏览器会根据返回的响应头中的Location字段中的新地址重新发送请求

注意,Location后面附加了一个参数参数cc应该是服务端根据登陆信息经过加密后的数据,与生成登陆凭据cookie有对应关系

之所以要通过302跳转的方式生成这个c,我推测是因为加密算法的私钥不能泄露在客户端,所以必须有服务端来生成加密后的数据,再通过Locationc带给目标的域名,这样一来保证了加密算法都统一维护在了sso这个服务端的代码下

(5)浏览器根据的Location字段中的新地址重新发送跨域请求:

返回的响应头中含有Set-Cookie选项,这样就在https://sso.jcloud.com域名下写入了登陆信息相关的cookie

SET-COOKIE: thor=3D19BE10EEAFA435CF3B318D409CB1E9E7ADC5BF43A9E5D59FA90B017918A5F6FB2323D13F4B408E9C050C911C4EBD06A6B61A5044F9E33135DF1A3D1A52317EC1BC5E0CC182D72826FA6587C266563B662299AC793759F548AF005AA7EA339BED10D4BE400DEE9BEB264DEE3599F3CF78B9C0F96C053BF12521B94D5B95AA39CF9290AF5D572663BC15433FBA48099A;path=/;domain=.jdcloud.com;httponly
Set-Cookie: pin=****; Domain=.jdcloud.com; Path=/
Set-Cookie: unick=****; Domain=.jdcloud.com; Path=/

cookide的domain设置为了.jcloud.com,表明该cookie可以被*.jcloud.com共享

(6)小结:

如果A域名和B域名(A与B的一级域名不同,因为二级域名是可以共享cookie的)要共享登陆状态,如果A域名已经登陆的状态下,B域名下的cookie是通过A向B发送跨域请求,由B将cookie写在自己的域名下

A向B发送的跨域请求中包含了经过加密的登陆信息,当A/B/C/D都设置了同意的加密凭据,也就做到了“单点登陆”的要求。至于如何对加密凭据进行解析则是经过了特定算法,由一个专门的后台服务(上面是/sso.jd.com/setCookie)进行处理。

CAS登陆原理

CAS是一个单点登录框架, 是Yale大学发起的一个开源项目,旨在为Web应用系统提供一种可靠的单点登录方法,代码目前在github上管理。

假设有两个CAS Client应用,一个CAS Server,各个应用的Session信息是不相同的,在浏览器中名为JSESSIONID的cookie信息都是各不相同的。某一个应用,无法读取其他应用的cookie信息。

(1)第一次访问Client1

用户打开浏览器后第一次访问Client1,页面会重定向到登陆页面,用户需要输入账号密码登陆。登陆成功后,跳转回Client1,详细过程如下:

关键点:

  1. Client1返回302,页面跳转到CAS Server时会携带参数service,指明要登录的子系统
  2. 用户输入用户名密码后,由CAS Server生成Ticket,跳转回Client1时在URL中返回Ticket
  3. Client1经重定向跳转后获取到Ticket,向Server发送请求校验Ticket的真实性
  4. 校验通过后Server返回登录名,并跳转到Client1
  5. Client1获取登录名后写入Request和Session,将JSESSIONID写入cookie(建立会话),并且将全局登陆信息TGT写入CAS Server域名(或者根域名下的)cookie

TGT是CAS Server为每一个登录用户创建的登录令牌。在CAS Server上拥有了TGT,用户就可以证明自己在CAS Server成功登录过。TGT封装了SessionCookie值以及此Cookie值对应的用户信息。当HTTP请求到来时,CAS以此Cookie值为key查询缓存中有无TGT ,如果有的话,则相信用户已登录过。

当用户已经访问过CAS Client后,当用户再次访问,系统不会再跳转到CAS Server做认证。

(2)用户第一次访问Client2

当用户已经登陆系统,切换到另一个CAS Client时,无序再次输入账号密码,过程如下:

这里面的与第一次访问Client1时的不同主要在于:

  1. 访问Client2时,由于没有Client2对应的JESSIONID,所以证明Client02并没有建立会话
  2. 重定向到CAS Server时,会携带上TGT的cookie,CAS server由此判断用户已经登陆,所以用户不必再次输入用户名和密码,直接发送Ticket
  3. 其余过程与时登陆Clinet1基本相同

(2)统一注销

当用户在浏览器中点击“注销”链接后,浏览器会访问CAS Server的注销页面(会携带上TGT的cookie),CAS Server会读取TGT,安检查当前用户登陆过的所有Client,并依次发送注销请求

CAS Client收到注销请求后,会根据URL中的Ticket,读取Session,将对应的Seesion删除、注销:

参考

  • 单点登录的三种实现方式@简书
  • CAS的登录和注销原理@阿里云
  • CAS实现单点登录SSO执行原理探究(终于明白了)@CSDN
  • SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析@CSDN

网络基础11 单点登录相关推荐

  1. 教程篇(7.0) 06. FortiGate基础架构 单点登录(FSSO) ❀ Fortinet 网络安全专家 NSE 4

     在本课中,你将学习Fortinet单点登录(FSSO).当你使用此功能时,你的用户不需要每次访问不同的网络资源时都登录.  本节课,你将学习这上图显示的主题.  通过展示理解SSO概念的能力,你将能 ...

  2. python 单点登录_清华园计算机系联合推出的Java+Python视频曝光

    Java 和 Python 双方都有各自适合和发展的领域,所以别人常问我学习什么语言好,或者让我在两种语言进行比较好坏. 其实编程语言只有适不适合你个人去学,并不存在好坏,每种语言的存在即是合理的,你 ...

  3. 简易的单点登录系统代码实现

    本文是对单点登录系统的一个简易代码实现,具体原理见 单点登录原理与简单实现 (可点击). 代码只涉及最基础的单点登录与注销.不涉及角色.权限.加密等.因为如果我们系统真要使用单点登录的话,应该不会自己 ...

  4. SpringBoot+Vue+CAS 前后端分离实现单点登录方案

    点击关注公众号,利用碎片时间学习 文章目录 前言 一.CAS是什么? 二.搭建客户端系统 引入CAS 客户端后端搭建 总结 前言 什么是单点登录?单点登录全称Single Sign On(以下简称SS ...

  5. 什么是单点登录及作用

    在程序开发中,特别是网站类开发,会接触到单点登录(SSO),什么是单点登录?,单点登录(SSO)有什么用?下面软币网小编来来介绍一下: 一.什么是单点登录? 单点登录的英文名叫做:Single Sig ...

  6. 什么是单点登录(SSO)?单点登录(SSO)到底什么意思?【附逻辑Demo实例】

    在程序开发中,特别是网站类开发,会接触到单点登录(SSO),什么是单点登录?,单点登录(SSO)有什么用?下面软币网小编来来介绍一下: 一.什么是单点登录? 单点登录的英文名叫做:Single Sig ...

  7. 使用WIF实现单点登录Part I——Windows Identity Foundation介绍及环境搭建 -摘自网络...

    上个月有一个星期的时间都在研究asp.net mvc统一身份验证及单点登录的实现.经过了一番的探索,最终决定使用微软的Windows Identity Foundation.但是这东西用的人貌似不多, ...

  8. 计算机---网络基础小知识点11.14

    计算机---网络基础知识点随笔记录 1.报文交换\电路交换\分组交换 1.1报文交换 电路交换 分组交换 2.传输速率和传播速率 3.OSI七层模型中各层的具体代表协议 4.网络地址 5.MAC地址 ...

  9. JAVA基础11 网络编程

    JAVA基础 11.网络编程 1.什么是网络?网络模型?网络四要素? 1.网络 在计算机领域中网络是信息传输,接收,共享的虚拟平台,通过它把各个点,面,体的联系到一起,从而实现这些资源的共享. 资源的 ...

最新文章

  1. Linux Exploit系列之三 Off-By-One 漏洞 (基于栈)
  2. 页面如何自动出现滚动条(overflow属性用法)
  3. Python基础教程:type()函数-动态创建类
  4. 内网渗透-域渗透简单思路
  5. 杜比收购低延迟流媒体平台Millicast
  6. c语言 将结构体放在flash,如何将 结构体 的 数据 定义在flash里面,并如何读出来,求各位达人帮助……...
  7. 吴恩达《机器学习》学习笔记十一——应用机器学习的建议
  8. 壁式框架内力计算_4种类型剪力墙的计算要点
  9. appium python unittest_appium+python+unittest自动化测试
  10. 这几个公众号带你看看BAT的工作情况
  11. [转]Linux下显示硬件信息--lshw
  12. 【白皮书分享】2021年智慧城市白皮书:依托智慧服务,共创新型智慧城市.pdf(附下载链接)
  13. mysql8.0日期类型_mysql8.0.19基础数据类型详解
  14. 使用filezilla server搭建ftp服务器
  15. js 生成二维码(qrcodejs)
  16. WIN7安装打印机时提示“打印机无法安装,打印处理器不存在”处理方法
  17. 亨嘉之会话数据行业未来 万字长文解码2021数据技术嘉年华
  18. 接口--PCI/PCIE
  19. 技术干货 | 如何用MindSpore优化器加速收敛高度逼近最优值?
  20. JS时间戳进行判断,判断是否超时三十分钟

热门文章

  1. ping github 请求超时解决方案
  2. kali系统搭建本地服务器,kali linux 下搭建git服务器
  3. 阿里Android高级架构师:一个牛逼的插件又双叒诞生了!
  4. 光谱反射率重建方法小总结
  5. Matlab 2019b simulink 生成C代码(一)
  6. 确保光学隔离的3.3V IC总线中的数据完整性
  7. 武汉.NET俱乐部武大赏樱花精彩图片
  8. 服务器安装kangle系统,云服务器安装kangle
  9. Visual Studio Code 或某些软件界面出现文字抖动/模糊/失真/残影
  10. 计算机网络时钟同步怎么理解,时钟与计算机网络中的时钟同步.pdf