当前位置: 首页 > news >正文

架构面试-场景题-单点登录(SSO)怎么实现的

文章目录

  • 概述
  • 基于Cookie
  • 基于Token(OAuth, JWT)
  • 集中式认证服务 (CAS, SAML)
  • 分布式Session:
  • 轻型目录访问协议(LDAP)
  • OAuth 2.0/OIDC
  • Kerberos

概述

单点登录(Single Sign-On,简称SSO)是一种身份验证机制,允许用户在多个应用程序和网站上使用一个凭据进行登录, 就是说 允许用户在多个应用或服务中只需进行一次身份验证即可访问所有授权的服务

基于Cookie

利用父域的Cookie机制,在主域名下设置一个共享的Cookie,子域名可以读取这个Cookie来确认用户的身份。
这种方法适用于同主域名下的多个子域名之间的SSO,但如果不同主域名则不适用。
优点: 实现简单,适用于同主域名下的多个子域名之间。
缺点: 不适用于跨主域名的情况,安全性较低,容易受到中间人攻击和跨站脚本(XSS)攻击。

基于Token(OAuth, JWT)

用户在身份提供者处验证后,获得一个Token(例如OAuth中的Access Token或JWT)。
Token被存储在客户端(如Cookie、LocalStorage)或服务器端(如Session),当用户访问其他应用时,应用通过Token验证用户身份。
这种方式支持跨域,且更安全,因为Token可以加密。

优点: 支持跨域,Token可加密传输,提高安全性;Token可以离线存储,减轻服务器负担。
缺点: 需要妥善管理Token的有效期和安全性,防止Token泄露;JWT如果过长可能影响性能。

集中式认证服务 (CAS, SAML)

中心化认证服务作为单一入口,所有应用都依赖它进行身份验证。
用户在CAS/SAML服务器上登录后,CAS/SAML服务器会生成一个Ticket或Assertion传递给应用,应用再使用这个Ticket或Assertion与CAS/SAML服务器通信,确认用户身份。
CAS和SAML是两种广泛使用的集中式认证协议。

优点: 提供标准化的SSO解决方案,易于集成;能够支持多种不同的应用和服务。
缺点: 中心化服务可能成为单点故障;配置和维护较为复杂。

分布式Session:

使用共享的Session存储(如Redis、Memcached),所有应用都可以访问同一个Session存储。
用户在任一应用登录后,Session信息被写入共享存储,其他应用可以通过读取这个共享Session来确定用户状态。

优点: 提高了应用的扩展性和可用性,Session数据可以在集群中共享。
缺点: 增加了对共享存储系统的依赖,存储系统故障会影响整个SSO流程。

轻型目录访问协议(LDAP)

LDAP用于存储和检索网络上的用户和组信息,支持SSO。
应用通过查询LDAP服务器验证用户身份,避免了每个应用单独维护用户信息。

优点: 便于管理和查询用户信息,适用于大型企业环境。
缺点: 配置和维护相对复杂,不适合小型或临时项目。

OAuth 2.0/OIDC

OAuth 2.0是一个授权框架,OpenID Connect(OIDC)建立在OAuth 2.0之上,提供了身份验证功能。
用户在一个授权服务器上登录后,授权服务器向客户端应用颁发令牌,应用使用这些令牌来访问资源服务器或确认用户身份。

优点: 标准化接口,易于第三方应用集成;支持多种授权模式。
缺点: 实现细节较多,需要仔细设计安全措施;可能存在权限过宽的问题。

Kerberos

Kerberos是一种网络认证协议,特别适合企业内部网络环境,支持SSO。
Kerberos使用票证(Ticket)机制来验证用户和服务,用户登录后会收到一系列票证,这些票证可以用于访问网络中的其他服务而无需再次输入密码。

优点: 安全性高,适用于大型企业内部网络;支持多种认证机制。
缺点: 配置复杂,维护成本高;仅限于内部网络,不适用于互联网环境。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ELK日志分析系统概述及部署
  • x264 编码器 AArch64 汇编函数模块关系分析
  • 【数据结构】排序——快速排序
  • 计算机网络体系结构解析
  • 微生活服务平台与元宇宙的融合
  • 《长相思》第二季回归:好剧质量,永恒的王牌
  • 常用录屏软件,分享这四款宝藏软件!
  • C++ STL iter_swap用法和实现
  • 视频汇聚平台EasyCVR设备录像回看请求播放时间和实际时间对不上,是何原因?
  • FPGA设计之跨时钟域(CDC)设计篇(2)----如何科学地设计复位信号?
  • Conda:Python环境管理的瑞士军刀
  • Oracle基础以及一些‘方言’(一)
  • 【C++】AVL树(旋转、平衡因子)
  • Python高级(三)_正则表达式
  • 小抄 20240709
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • ERLANG 网工修炼笔记 ---- UDP
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • exif信息对照
  • golang 发送GET和POST示例
  • HashMap剖析之内部结构
  • interface和setter,getter
  • java2019面试题北京
  • Java深入 - 深入理解Java集合
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • k8s如何管理Pod
  • LeetCode29.两数相除 JavaScript
  • nginx 配置多 域名 + 多 https
  • Python打包系统简单入门
  • 关于字符编码你应该知道的事情
  • 一些css基础学习笔记
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • #HarmonyOS:Web组件的使用
  • #stm32整理(一)flash读写
  • $(function(){})与(function($){....})(jQuery)的区别
  • (+4)2.2UML建模图
  • (C#)获取字符编码的类
  • (C语言)共用体union的用法举例
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (WSI分类)WSI分类文献小综述 2024
  • (八)Flink Join 连接
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (转)3D模板阴影原理
  • (转)memcache、redis缓存
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .NET 分布式技术比较
  • .NET 设计模式初探
  • .Net接口调试与案例
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .php结尾的域名,【php】php正则截取url中域名后的内容