单点登录的几种实现方式探讨

news2024/9/24 15:25:54

单点登录(Single Sign On),简称为 SSO,是解决企业内部的一系列产品登录问题的方案。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,用于减少用户重复的登录操作,提升用户体验。从技术层面上讲,单点登录目前有多种实现方案,本文从博主个人的理解出发,比较这几种不同方案的优劣和适用场景。

一、单点登录的前提

单点登录的前提是,拥有统一的登录账号,统一的授权中心,登录一次就可以访问所有相互信任的应用系统。

简单来说,就是用户的一个登录凭证可同时供多个系统使用,或者登录凭证通过授权中心进行某种转换后可以提供给各自的系统使用,这种转换可在前端进行、也可在后端进行。

而单点登录要解决的问题就是,这个可供互信系统共同使用的登录凭证如何让多个互信系统都能跨域获取到,并让非法站点无法跨域获取到。

互信是对用户登录凭证的互信,需要能获取到互信应用站点的用户凭证,否则互信没有任何意义。

本文认为,统一的授权中心是单点登录的前提,全文都基于已实现统一授权中心的基础上。关于如何实现统一的授权中心也许可以借鉴 Oauth 的方案,其实通过 JWT 就已经可以很轻松实现授权中心了。

二、单点登录的方案比较

不同方案有不同的适用场景,各有优劣。

2.1 通过共享cookie实现

这是最简单的一种单点登录实现方式,用户在授权服务上进行登录,使用 cookie 作为媒介存放用户登录凭证,当用户访问互信的应用系统时携带上这个 cookie,应用拿到 cookie 进行校验,从而实现跨应用登录。

适用场景:

互信的子应用都在同一个主域名下,分别使用相同或者不同的子域名,在 cookie 存储时指定 domain 为二级域名,可以便捷的实现互信应用的 cookie 共享,从而达到单点登录的目的。

优点:

  1. 实现简单,开发工作量低;
  2. 由于 cookie 在请求时可以自动携带,单点登录非常丝滑,不需要先跳转授权中心的界面获取和验证凭证,直接就可以获取到凭证。

缺点:

  1. 限制为同一个主域名,对于复杂的场景不可用;
  2. 安全性较低,容易存在登录凭证被跨域获取的问题,即 Cross-site request forgery,简称 CSRFXSRF (跨站请求伪造);
  3. 登录凭证通过 cookie 自动携带,在访问应用前没有进行凭证的校验。

关于安全性,有方案说可以在存储前对 cookie 存储的登录凭证进行加密处理。个人认为有一定的效果,但是用处不大,因为就算加密了之后还是需要通过 JavaScript 解密然后发给服务端,JavaScript 解密这个过程是可分析的、不安全的,而且 cookie 在请求时自动携带的内容变为了无效数据。

如果不解密直接发送给服务端的话,加密也没有意义,恶意用户也无须关心凭证内容,直接发送给服务端请求就可以获取用户数据。

案例:

在调研单点登录方案时,稍微分析了百度的单点登录方案,百度就是通过共享 cookie 方案实现的单点登录,共涉及到 BDUSSBDUSS_BFESS 两个 cookie 项,为了安全性其都设置为了 HttpOnly,禁止了 JavaScript 访问凭证。

百度通过cookie记录登录状态

可以看到 BDUSSBDUSS_BFESS 都存储在了 .baidu.com 这个主域名下,所有的例如 tieba.baidu.comzhidao.baidu.com 等百度系的产品在请求时都会自动携带上这两个登录凭证,从而实现单点登录。这全程都是自动的,所以百度的这些产品单点登录都非常丝滑,无须界面上的跳转和点击重新授权等操作。

限制就是,百度的应用都在 baidu.com 这个主域名下,如果不在主域名下这个方案就不可行了。

2.2 通过页面重定向实现

互信的应用系统先从自己的 localStore 中尝试获取登录凭证,获取失败跳转授权中心的界面让用户登录,登录通过后携带登录凭证重定向到应用登录跳转地址,应用的登录跳转页面进行访登录凭证的存储,最后再跳转实际要访问的界面。

重定向的地址需要做校验,避免随意一个跳转地址都可以正常重定向而造成登录凭证泄露。

适用场景:

互信的子系统不在同一个主域名下。

通过 Oauth 实现单点登录采用的大都是这种方式。

优点:

  1. 解决了共享 cookie 方案需要同一主域名的限制;
  2. 不会自动携带登录凭证,避免 CSRF 问题;
  3. 可以在跳转时针对不同应用系统做安全性校验,发放不同的登录凭证,某个应用系统出现凭证泄露等安全问题,不影响互信的其他应用系统。

缺点:

体验不好,用户就算已经登录过其他互信系统了,在第一次访问还是需要进行一次跳转,无法丝滑的实现单点登录。

案例:

这种单点登录方式可对照 Oauth 的授权码模式,只是相比于 Oauth 来说更加的简单,用户无须进行授权。

应用系统跳转到授权服务的界面,授权服务验证用户登录状态,通过后发放给应用系统一个登录票据(类似于 Oauth 的授权码),应用系统拿着登录票据获取获取登录凭证并存储,最后跳转要访问的地址。

访问请求的地址 > SSO验证界面检验登录 > 应用系统登录跳转页面获取凭证 > 访问请求的地址

如上流程,共经过了 3 次的界面上的跳转,整体流程还是比较长的。

2.3 通过内嵌iframe实现

互信的系统先从自己的 localStore 中尝试获取登录凭证,获取失败后跳转应用系统自己的登录界面,通过 iframe 打开授权中心的界面让用户登录,用户登录成功后通过 iframe postMessage 传送登录凭证到应用系统,应用系统的登录页面进行访登录凭证的存储,最后再跳转实际要访问的界面。

适用场景:

互信的子系统不在同一个主域名下。

优点:

  1. 用户感受上仅跳转到登录界面,相比于与页面重定向方式体验更加的友好;
  2. 能够自定义登录页面。

缺点:

  1. 需要授权服务开发提供给 iframe 访问的界面,且需要和应用系统适配,复杂性较高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/400235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyTorch的自动微分(autograd)

PyTorch的自动微分(autograd) 计算图 计算图是用来描述运算的有向无环图 计算图有两个主要元素:结点(Node)和边(Edge) 结点表示数据,如向量、矩阵、张量 边表示运算,如加减乘除卷积等 用计算…

共话开源 | 开放原子开源基金会专题调研openKylin社区!

3月8日,开放原子开源基金会秘书长冯冠霖、运营部部长李博、业务发展部部长朱其罡、研发部副部长周济一行莅临openKylin社区调研交流,麒麟软件高级副总经理韩乃平、副总裁董军平、终端研发部副总经理陆展、产品规划部经理常亚武、市场与政府事务部高级经理…

力扣sql简单篇练习(二十五)

力扣sql简单篇练习(二十五) 1 无效的推文 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below SELECT tweet_id FROM Tweets WHERE CHAR_LENGTH(content)>151.3 运行截图 2 求关注者的数量 2.1 基本题目内…

【Linux实战篇】二、在Linux上部署各类软件

一、实战章节:在Linux上部署各类软件 二、MySQL数据库管理系统安装部署【简单】 简介 MySQL数据库管理系统(后续简称MySQL),是一款知名的数据库系统,其特点是:轻量、简单、功能丰富。 MySQL数据库可谓是…

在矩池云运行 Stable Diffusion web UI,使用v1.5模型和 ControlNet 插件

今天给大家介绍下如何在矩池云使用 Stable Diffusion web UI v1.5 模型和 Stable Diffusion ControlNet 插件。 租用机器 租用机器需要选择内存大于8G的机器,比如 A2000,不然 Stable Diffusion web UI 启动加载模型会失败。(Killed 内存不足…

近20个省市加快房屋网签备案,君子签电子签章助推掌上办理

2020年以来,上海、北京、深圳、长沙、武汉、杭州、山东、郑州、西安、佛山、青岛、江门、昆明、韶关、南京、石家庄等全国近20个省市纷纷响应住建部政策要求,鼓励使用电子签名、电子签章等技术加快推动商品房、二手房或租赁房交易合同网签备案&#xff0…

是面试官放水,还是公司实在是太缺人?这都没挂,字节原来这么容易进...

字节是大企业,是不是很难进去啊?” “在华为做软件测试,能得到很好的发展吗? 一进去就有10K,其实也没有想的那么难” 直到现在,心情都还是无比激动! 本人211非科班,之前在字节和腾讯…

UEFI开发探索101 – PCD探究(helloworld中的使用)

2 如何使用PCD PCD可以使用于UEFI存在的大部分时间,除了在SEC阶段、早期的PEI和DXE阶段,基本都可以访问。在使用前,我们需要搞清楚PCD的结构和类型。 2.1 PCD的类型 PCD变量的格式有点像结构体: TokenSpaceGuidCName.PcdCName …

【SpringCloud】SpringCloud教程之Gateway实战

目录前言SpringCloud Gatewy网关一.网关功能和工作原理二.网关的类型三.搭建网关四.路由断言工厂(Route Predicate Factory)五.路由过滤器(属于GatewayFilter)六.DefaultFilter过滤器(属于GatewayFilter)七.全局过滤器(GlobalFilter)八.过滤器执行顺序九.Gateway解决跨域问题前…

什么蓝牙耳机适合长时间佩戴?长久佩戴舒适的蓝牙耳机

因为我每天使用蓝牙耳机时间比较长,而且在上下班的路上经常会听听音乐,所以还是非常在意耳机的舒适度,有些耳机压迫感很明显,用久了感觉很不舒服,近期就购入了许多蓝牙耳机,终于整理出了一起佩戴舒适度高的…

vue+echarts.js 实现中国地图——根据数值表示省份的深浅——技能提升

最近在写后台管理系统&#xff0c;遇到一个需求就是 中国地图根据数值 展示深浅颜色。 效果图如下&#xff1a; 直接上代码&#xff1a; 1.html部分 <div id"Map"></div>2.css部分——一定要设置尺寸 #Map {width: 100%;height: 400px; }3.js部分 …

【立体匹配论文阅读】AANet: Adaptive Aggregation Network for Efficient Stereo Matching

Authors: Haofei Xu, Juyong Zhang Link: https://arxiv.org/abs/2004.09548 Years: 2020 Credit Novelty and Question set up 主流的立体匹配模型的代价聚合操作主要用了3D卷积&#xff0c;这部分操作的算力和内存消耗过大&#xff0c;因此作者提出一种新的模型AANet&#x…

C#项目--GridControl数据绑定及数据引入

系列文章 C#项目–业务单据号生成器&#xff08;定义规则、自动编号、流水号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 C#项目–开始日期结束日期范围计算&#xff08;上周、本周、明年、前年等&#xff09; 本文链接&…

KUKA机器人修改机器人名称和IP地址的具体方法示例

KUKA机器人修改机器人名称和IP地址的具体方法示例 修改机器人名称 如下图所示,首先切换用户组到管理员,输入默认密码:kuka, 如下图所示,点击菜单键—投入运行—机器人数据, 如下图所示,此时可以看到机器人的名称为rrr445, 如下图所示,修改之后,点击左侧的“”…

C#项目--打印模板解决方案(自定义模板、条形码、二维码、图片)

系列文章 C#项目–业务单据号生成器&#xff08;定义规则、自动编号、流水号&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129129787 C#项目–开始日期结束日期范围计算&#xff08;上周、本周、明年、前年等&#xff09; 本文链接&…

win11安装ubuntu子系统与桌面 填坑记录

win11安装ubuntu子系统win11可以直接从应用市场安装ubuntu子系统。详细安装步骤见参考资料。这里列出一些博主遇到的问题。填坑之路从应用市场获取ubuntu系统时会报0x80240438或者0x80072efd等错误。网络连接有问题&#xff0c;关闭windows防火墙再试&#xff0c;多试几遍安装u…

【刷题笔记】--二分-P2440 木材加工

题目&#xff1a; 思路&#xff1a; 先在所有树中找到最长的树&#xff0c;从 1 到 这个最长的树的长度 的所有数作为二分查找的值&#xff0c;让每棵树除这个值&#xff0c;表示可以切出几段出来&#xff0c;累加在一起得到s&#xff0c;s表示一共有几段。s与k比较&#xf…

windows如何安装两个版本的mysql的方法

Windows上安装两个版本的mysql 背景&#xff1a;在学习项目的时候&#xff0c;项目中使用mysql5.7的版本&#xff0c;而自己的windows系统中安装的是mysql8.0版本&#xff0c;在尝试将项目中的mysql5.7版本的代码更改到8.0版本后仍然报错&#xff0c;故尝试更改windows系统中的…

低代码有哪些典型应用场景?

低代码有哪些典型应用场景&#xff1f; 低代码是一种全新的应用开发方式&#xff0c;它通过可视化的拖拽式界面&#xff0c;将传统的繁琐代码编写转化为简单的拖拽操作&#xff0c;让非技术人员也能够快速地开发出应用程序。 随着数字化转型的不断加速&#xff0c;低代码平台…

1.webpack的基本使用

webpack是做工程化用的&#xff0c;并且可以对代码进行压缩(搞成min.js那样)&#xff0c;处理浏览器端JS兼容性&#xff0c;性能优化 vue-cli与webpack作用相同 目录 1 基本使用 1.1 引入场景 1.2 安装webpack 1.3 配置webpack 1.4 使用webpack 2 webpack.config.…