单点登录(SSO,Single Sign On)对我们来说已经不陌生了,一次登录,处处登录。企业旗下都是自己的应用系统,所有的应用系统都使用同一个一级域名,通过不同的二级域名来区分应用系统。例如:百度,百度下面有很多子系统——百度文本库、百度知道等。在我们的体验中,登录了百度帐号,其他子应用系统也就随之登录了。这次,让我们了解下背后实现原理--同域下的单点登录。

同域 SSO 原理设计

  1. 门户系统设置 Cookie 的 domain 为一级域名 authing.com,这样就可以将门户的 Cookie 共享给所有使用该域名(authing.com)的系统。
  2. 使用 Spring Session 等技术让所有系统共享 Session。
  3. 门户系统登录之后,无论是跳转应用一还是应用二,都能通过门户 Cookie 中的 SessionId 读取到 Session 中的登录信息,实现单点登录。

同域 SSO 原理分析

HTTP 协议是无状态的,单个系统的会话由服务端 Session 进行维持,Session 保持会话的原理是通过给浏览器返回 Set-Cookie 请求头,浏览器收到后把包含 Sessionid 的 Cookie 写入浏览器,每次访问都会自动携带该站点下的 Cookie,在服务端读取其中的 Sessionid 进行验证,实现会话保持。通过巧用 Cookie 顶域的特性和 Session 共享,可以实现同域下的多个系统登录认证,也就是同域下的单点登录。

Session-Cookie 机制

服务端通过 Cookie 认证客户端。

用户在第一次登录后,服务端将返回一个 Cookie 给客户端(这个 Cookie 包含 Sessionid),用户下一次发起请求后将在 header 带上这个 Cookie,服务端便可以识别出具体的客户端。

Spring-Session 共享

解决同域下集群 Session 共享的问题。当服务端为集群而不是单点的时候,需要集群服务器之间的 Session 共享才能实现 Session-Cookie 机制的同域 SSO。

实现方式:通过过滤器拦击请求,获取 Session 数据并保存到数据库(Session 持久化),之后 Session 数据将统一从数据库中获取。

同域 SSO 验证方式

同一个域名下的不同站点是如何进行验证

根据浏览器的 Cookie 同源规则,两个站点是可以共享 Cookie 的,前提是这两个站点在同一个域名(或者二级域名)下。

这种同域下的 Cookie,浏览器会将 Cookie 以及 Cookie 所属的域存在本地。当对该域下的任何子站点进行访问的时候,浏览器会将这些 Cookie 发送给站点系统。

假设:我们有两个站点 www.authing.com/site1,www.authing.com/site2 。这两个站点共享同一个主机地址,并且二者在同一域名下。

  1. 登录 www.authing.com/site1 ,浏览器会有一个来自 www.auhting.com/site1 的身份鉴证的 Cookie。当你点击 site1 下的任何子页面的时候,这些 Cookie 都会发送给site1。
  2. 当请求 www.authing.com/site2 的时候,对于 site2 下面的任何子页面,这些 Cookie 也同样会随着请求发送过去。

当浏览器端存储的 Cookie 的域是 www.authing.com 的时候,site1 和 site2 两个站点是同属于该域的。所以对于该域下的 Cookie,两个站点都可以得到。只要它们的 Session 信息是保存在同一个地方即可。

同一个域名下不同的子域如何进行验证

假设:我们的站点是按照下面的域名进行部署的 sub1.auhting.com, sub2.authing.com, 这两个站点共享同一域 authing.com。

默认情况下,浏览器会发送给 Cookie 所属域所对应的主机。也就是说,sub1.auhting.com, sub2.authing.com 的 Cookie 的默认所属域是不同的,因此我们需要在服务端通过设置 Cookie domain 来进行处理。

  1. 登录 sub1.authing.com 系统。
  2. 登录成功以后,设置 Cookie 信息。我们将 SessionId 存到 Cookie 中,同时必须将这 个Cookie 的所属域设置为顶级域 .authing.com。
  3. 访问 sub2.authing.com 系统,浏览器会将 Cookie 中的信息 SessionId 附带在请求中一同发送到 sub2.authing.com 系统。这时该系统会检查到 Session 为已登录状态,然后放行。

当然,登录 sub2.authing.com 的方式也是相同的。经过上面的步骤就可以实现不同二级域名的单点登录了。

百度系列应用的单点登录

下面我们通过一个具体的例子来体会一下同域下不同应用的单点登录和单点登出,这次我们选择了百度知道和百度网盘。

我们登录百度网盘,百度会将共享登录状态的 Cookie 写入到了 .baidu.com 域名之下,然后我们刷新百度知道,网站变成了已登录状态,便能在发出的第一个请求中查看到携带了 .baidu.com 域名下的 Cookie,百度也已经为我们返回的页面上打印出了用户名。

接下来我们删除这两个 Cookie:BDUSS、BDUSS_BFESS,然后切换到百度网盘并刷新页面,系统显示已经退出。服务器返回 HTTP 响应,通过 Set-Cookie Header 将 .baidu.com 下的两个 Cookie 删除,浏览器删除 Cookie 后,同域下的其他网站也就单点退出了。

单点登录机制已成为企业身份及访问管理解决方案中不可或缺的组成部分。同域下的单点登录,是单点登录机制方面的一种常见的解决方案。下期,我们再聊聊跨域下的单点登录,以及更多全方位的身份和访问管理解决方案,请持续关注 Authing。

将一个域下的cookie传到另一个域_单点登录那些事儿(二)同域下的单点登录相关推荐

  1. QQ登录IE下iframe跨域session和cookie失效问题的解决方案

    情景:webQQ登录,使用的是跨站点iframe弹窗登录,发现只有在IE浏览器下,登录存储session不起作用,一刷新页面就登出 分析:IE限制第三方session/cookie 随着IE版本的不断 ...

  2. 如何跨域请求携带 cookie ?

    前言 最近在参加面试找工作,陆陆续续的面了两三家.其中面试官问到了一个问题:如何解决跨域问题?我巴巴拉拉的一顿说,大概了说了四种方法,然后面试官紧接着又问:那跨域请求怎么携带cookie呢?(常规的面 ...

  3. php domain cookie cross-domian,跨域(cross-domain)访问 cookie (读取和设置)

    Passport 一方面意味着用一个帐号可以在不同服务里登录,另一方面就是在一个服务里面登录后可以无障碍的漫游到其他服务里面去.坦白说,目前 sohu passport 在这一点实现的很烂(不过俺的工 ...

  4. 跨域(cross-domain)访问 cookie (读取和设置)

    跨域(cross-domain)访问 cookie (读取和设置) Passport 一方面意味着用一个帐号可以在不同服务里登录,另一方面就是在一个服务里面登录后可以无障碍的漫游到其他服务里面去.坦白 ...

  5. 在使用谷歌时发现一个诡异问题cookie传不过去

    在使用谷歌时发现一个诡异问题cookie传不过去 查找相关资料发现这是谷歌的一个新属性SameSite导致的, SameSite 属性 Cookie 的SameSite属性用来限制第三方 Cookie ...

  6. 子域和域之间共享cookie

    2个域mydomain.com和subdomain.mydomain.com只能在Set-Cookie头中明确指定域的情况下共享Cookie. 否则,cookie的范围仅限于请求主机. (这被称为&q ...

  7. 跨域请求携带cookie

    默认情况下是跨域是不会携带cookie的,例如:a.com 网站请求 b.com 的接口,这个时候不会把a.com这个域名下的 cookie 携带上.如果需要携带,则需要做一下配置 前端配置 XMLH ...

  8. jquery uploadify在谷歌浏和火狐下无法上传的解决方案(.Net版)

    在项目紧张的进行过程中,jquery uploadify上传不兼容的问题一直没有试着去解决,只幻想着用ie的人越来越多,怎么奈何firefox4刚推出,就有4000万的下载.......仰天长叹,记生 ...

  9. jquery uploadify在谷歌浏和火狐下无法上传的解决方案

    一.jquery uploadify自我介绍: 支持单文件或多文件上传,可控制并发上传的文件数 在服务器端支持各种语言与之配合使用,诸如PHP,.NET,Java-- 通过参数可配置上传文件类型及大小 ...

最新文章

  1. 读完ACL 2019录取的30篇知识图谱论文,我发现了这5点趋势
  2. 易宝典——玩转O365中的EXO服务 之三十六 为软删除邮箱启用就地保留
  3. C语言signal()函数(通过设置一个函数(回调函数)来处理捕获到异常信号时需要执行的操作)
  4. spring boot基础教程:入门程序Hello World的编写
  5. 在阿里云服务器上安装docker
  6. 机器视觉技术在表面缺陷检测方面的发展趋势
  7. [SDOI2016]排列计数 (错排数概念 + 递推公式【附带证明】)
  8. 路由器下一跳地址怎么判断_路由器的功能及工作原理
  9. 基于Android的手机邮件收发(JavaMail)之二( Welcome.java 和 ReceiveAndSend.java )
  10. Oracle伪列(ROWNUM)的使用
  11. 泰克吉时利Keithley数据采集器自动计量校准软件NSAT-3070
  12. 指标之王macd的计算公式和使用方法
  13. 如何玩转阿里巴巴国际站Trueview视频?
  14. Unity3D “xx AnimationEvent has no function name specified!”解决方案
  15. IDS-IPS入侵防御原理与实践
  16. Licheepi zero SPI Flash 系统编译
  17. 网易云音乐评论 可视化分析
  18. js点击元素之外的地方隐藏该元素
  19. win10无法连接网络里的其他计算机名,win10系统无法访问局域网的其他电脑的解决办法...
  20. echarts柱状图如何从纵向改为横向

热门文章

  1. Quartz框架架构
  2. Zookeeper的作用
  3. 再给大家发 200 个红包!
  4. 面试官:Spring事务的传播行为有几种?
  5. 经典笔试题: 二叉树中和为某一值的路径(路径总和)
  6. LeetCode-73. Set Matrix Zeroes
  7. 笔记 - AliCloud Auto Scaling(弹性伸缩)简介
  8. html给文字加黑色边框,如何给显示文字加一层黑色边框
  9. 安装mysql.dox_linux虚拟机上装mysql数据库-Go语言中文社区
  10. 青少年计算机学奥林匹克大赛,2019年第36届全国青少年信息学奥林匹克竞赛获奖规则...