背景介绍

随着业务与技术的发展,现今比以往任何时候都更需要单点登录 SSO 身份验证。

现在几乎每个网站都需要某种形式的身份验证才能访问其功能和内容。

随着网站和服务数量的增加,集中登录系统已成为一种必要。

在本文中,我们将研究 SSO 身份验证的方案演进。

问题描述

开发团队迟早会面临一个问题,已经开发了网站 A,新开发的网站 B 希望使用网站 A 的登录信息,而不是使用一套新的登录信息,如下图所示:

事实上,你可能还希望已经在网站 A 登录的用户自动完成网站 B 的登录。

问题的解决方案显然是实现跨不同域之间共享会话信息。但是,由于安全原因,浏览器会强制执行同源策略 - Same Origin Policy。

该策略规定,Cookies 只能由其创建者访问。换句话说,如果网站 A 和 网站 B 不是同域,网站 B 无法访问网站 A 的 Cookies,反之亦然,如下图所示:

SSO 其实就是要以某种方式解决不同域之间共享会话信息。

解决方案

一、同源解决方案

要解决不同域之间共享会话信息,一个最简单粗暴的办法就是让网站同域,如下图所示:

1. 用户浏览网站 A

2. 网站 A 发现无 *.domain.com 的 Cookies,重定向到认证中心

3. 认证中心要求用户使用账号密码登录

4. 认证中心保存 Cookies 到 *.domain.com

5. 重定向返回网站 A

6. 网站 A 读取 *.domain.com 下的 Cookies 完成校验,展示网站内容

7. 用户浏览网站 B

8. 网站 B 读取 *.domain.com 下的 Cookies 完成校验,展示网站内容

二、非同源解决方案

同源的解决方案可以满足大部分场景,但是针对一些多产品的场景,比如,阿里巴巴有天猫和淘宝两个产品,同源解决方案显然不能满足需求。

不同的 SSO 协议以不同的方式共享会话信息,但基本概念是相同的:有一个认证中心,执行身份验证,然后以某种方式与其他域共享会话信息。

其中一种方式是使用 JWT - JSON Web Token,认证中心使用 JWE - JSON Web Encryption 对用户信息进行加密,生成 JWT。

然后通过重定向的方式,把 Token 传回原始站点,Token 包含需要验证用户所需的所有信息。

由于 Token 是使用 JWT 加密的,除了认证中心外无法以任何方式修改它,具体流程如下:

1. 用户浏览网站 A

2. 网站 A 发现无 domain1.com 的 Cookies,重定向到认证中心

3. 认证中心要求用户使用账号密码登录

4. 认证中心保存 Cookies 到 auth.com

5. 重定向返回网站 A 并在 URL 携带验证用户信息的 Token

6. 网站 A 校验 Token 完成验证

7. 网站 A 保存 Cookies 到 domain1.com,供后续验证使用,并显示网站内容

8. 用户浏览网站 B

9. 网站 B 发现无 domain2.com 的 Cookies,重定向到认证中心

10. 认证中心发现有 auth.com 的 Cookies,对 Cookies 进行校验

11. 重定向返回网站 B 并在 URL 携带验证用户信息的 Token

12. 网站 B 校验 Token 完成验证

13. 网站 B 保存 Cookies 到 domain2.com,供后续验证使用,并显示网站内容

总结归纳

以上就是本文需要介绍的 SSO 相关内容,大家有问题的话欢迎在文章或者在公众号 - 跬步之巅留言交流。

SSO 方案演进的更多相关文章

  1. 基于Kubernetes(k8s)网络方案演进

    VIP PaaS在接近两年时间里,基于kubernetes主要经历四次网络方案的变迁: 1. kubernetes + flannel 2. 基于Docker libnetwork的网络定制 3. k ...

  2. c++再探string之eager-copy、COW和SSO方案

    在牛客网上看到一题字符串拷贝相关的题目,深入挖掘了下才发现原来C++中string的实现还是有好几种优化方法的. 原始题目是这样的: 关于代码输出正确的结果是()(Linux g++ 环境下编译运行) ...

  3. 什么是 SSO 与 CAS?

    SSO SSO 是英文 Single Sign On 的缩写,翻译过来就是单点登录.顾名思义,它把两个及以上个产品中的用户登录逻辑抽离出来,达到只输入一次用户名密码,就能同时登录多个产品的效果. 打个 ...

  4. 单点登录系统构建之二——SSO原理及CAS架构

    基本概念 SSO(Single Sign On)单点登录,是在多个应用系统中,用户只需要登录一次就能访问所有相互信任的应用系统.它包括将这次的主要登录映射到其他应用中用户同一个用户的登录机制. SSO ...

  5. ONOS系统架构演进,实现高可用性解决方案

    上一篇文章<ONOS高可用性和可扩展性实现初探>讲到了ONOS系统架构在高可用.可扩展方面技术概况,提到了系统在分布式集群中怎样保证数据的一致性.在数据终于一致性方面,ONOS採用了Gos ...

  6. 手把手教做单点登录(SSO)系列之一:概述与示例

    本系列将由浅入深的结合示例.源码以及演示视频,手把手的带大家深入最新的单点登录SSO方案选型与架构开发实战.文末附5个满足不同单点登录场景的gif动画演示(如果看不清请在图片上右键用新窗口打开),本系 ...

  7. 最准确的单点登录SSO图示和讲解(有代码范例)|手把手教做单点登录(SSO)系列之二

    写第一篇博客<手把手教做单点登录(SSO)系列之一:概述与示例>,就获得了园子里朋友们热情的评论和推荐,感谢各位. 我那篇文章同时发了CSDN和博客园.对比一下,更感受到博客园童鞋们的技术 ...

  8. 单点登录SSO:可一键运行的完整代码

    单点登录方案不同于一个普通站点,它的部署比较繁琐:涉及到好几个站点,要改host.安装证书.配置HTTPS. 看到的不少这方面示例都是基于HTTP的,不认同这种简化: 1. 它体现不出混合HTTP/H ...

  9. 单点登录SSO:图示和讲解

    目录 概述 示例运行效果动画 跨域Web SSO时序图 代码截图 几个基本概念 涉及的站点和页面 重点理解:单点登录的核心步骤 敢说最准确的单点登录图示,因为: 我严格对照所画时序图的每个步骤,开发了 ...

随机推荐

  1. Zookeeper 的 java 客户端都有哪些?

    java 客户端:zk 自带的 zkclient 及 Apache 开源的 Curator.

  2. Spring工作原理:初识SpringMVC

    1.SpringMVC简介 SpringMVC是Spring框架的一个模块.SpringMVC和Spring无需通过中间层进行整合.是一个轻量级的,基于请求响应的MVC框架. 2.1.什么是MVC? ...

  3. SpringCloud个人笔记-03-Config初体验

    sb-cloud-config 配置中心 <?xml version="1.0" encoding="UTF-8"?> <project xm ...

  4. C/C++头文件以及避免头文件包含造成的重定义方法

    C 头文件 头文件是扩展名为 .h 的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享.有两种类型的头文件:程序员编写的头文件和编译器自带的头文件. 在程序中要使用头文件,需要使用 C 预处 ...

  5. 基于MPC算法的车辆多目标自适应巡航控制系统研究_荆亚杰

  6. 关于mysql使用utf8编码在cmd窗口无法添加中文数据的问题以及解决 方法二

    如果非要用cmd窗口的话,那么可以加这句话,set names gbk:

  7. 拼写检查-c++

    [问题描述] 作为一个新的拼写检查程序开发团队的成员,您将编写一个模块,用已知的所有形式正确的词典来检查给定单词的正确性.        如果字典中没有这个词,那么可以用下列操作中的一个来替换正确的单 ...

  8. npm 和 Yarn 镜像站配置

    Node.js 作为近年来非常受欢迎的 Web 开发运行环境,由于开发者众多,贡献开源代码的人也很多,所有这些凝结成了 npm 这个世界上最大的软件包仓库,但是受限于 npm 软件包的服务器在国外,国 ...

  9. 【LeetCode】567. 字符串的排列

    567. 字符串的排列 知识点:字符串:滑动窗口 题目描述 给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列.如果是,返回 true :否则,返回 false . 换句 ...

  10. 搜索与图论①-深度优先搜索(DFS)

    深度优先搜索(DFS) 例题一(指数型枚举) 把 1∼n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序. 输入格式 一个整数 n. 输出格式 按照从小到大的顺序输出所有方案,每行 1 个. ...