单点登录协议

news2024/10/6 6:00:24

认证和授权

认证:确认该用户的身份是他所声明的那个人
授权:根据用户身份授予他访问特定资源的权限
当用户登录应用系统时,系统需要先认证用户身份,然后依据用户身份再进行授权。认证与授权需要联合使用,才能让用户真正登入并使用应用系统。

CAS

CAS,Central Authentication Server,一种常见的B/S架构的SSO协议。和其它任何SSO协议一样,用户仅需登录一次,访问其它应用则无需再次登录。
CAS是一种仅用于Authentication的服务,和OAuth/OIDC协议不一样,并不能作为一种Authorization的协议。
当前CAS协议包括CAS 1.0、CAS2.0、CAS3.0版本,这三个版本的认证流程基本类似。
CAS的认证流程通过包括几部分参与者:
client:通常为使用浏览器的用户
CAS Client:实现CAS协议的web应用
CAS Server:作为统一认证的CAS服务器
认证流程大致为:
在这里插入图片描述

1.client(终端用户)在浏览器里请求访问web应用example;
2.浏览器发起一个GET请求访问example应用的主页https://www.example.com;
3.应用example发现当前用户处于未登录状态,redirect用户至CAS服务器进行认证;
4.用户请求CAS服务器;
5.CAS发现当前用户在CAS服务器中处于未登录状态,要求用户必须得先登录;
6.CAS服务器返回登录页面至浏览器;
7.用户在登录页面中输入用户名和密码(或者其它认证方式)
8.用户把用户名和密码通过POST,提交至CAS服务器
9.CAS对用户身份进行认证,若用户名和密码正确,则生成SSO会话,且把会话ID通过cookie的方式返回至用户的浏览器端(此时,用户在CAS服务端处于登录状态)
10.CAS服务器同时也会把用户重定向至CAS client,且同时发送一个Service Ticket;
11.CAS client的服务端收到Service Ticket以后,请求CAS Server对该ticket进行校验;
12.CAS Server把校验结果返回给CAS Client,校验结果包括该ticket是否合法,以及该ticket中包含对用户信息;
13.至此,CAS Client根据Service Ticket得知当前登录用户的身份,CAS Client处于登录状态
经过上述流程,CAS Server和CAS Client都处于登录状态,当用户如果访问另外一个CAS Client2的时候,用户不需要再次认证,即会跳过5.6.7.8.9这几步,从而达到SSO的效果。
注: CAS 1.0是个非常简单粗陋的协议,在2.0、3.0版本中,Service Ticket的校验结果均为XML格式, 且引入了一种proxy模式(不在本文做深入讨论)。
CAS协议的详细标准定义,请参考:
https://apereo.github.io/cas/6.2.x/protocol/CAS-Protocol-Specification.html
笔者意见:

  1. CAS协议是一个比较简陋单点登陆协议,协议本身比较轻量级也比较容易实现,但是能够解决的场景比较单一;
  2. 杂乱:CAS 3.0又引入了基于SAML对Service Ticket进行校验;
  3. CAS Client和CAS Server之间的互信是通过接口调用的方式来建立, 没有任何加密/签名机制来保证进一步的安全;
  4. 缺乏校验CAS Client自身身份的机制;
  5. 市面上实现了CAS协议的应用并不多,笔者也不推荐这种协议。

OAuth 2.0

谈到OAuth, 通常是指OAuth 2.0协议,它是一种Authorization协议并不是一种Authentication协议,虽然OAuth 2的流程中只描述了Authorization。但是在实际使用中,Authorization脱离Authentication并没有任何意义。
OAuth 2.0解决的主要场景是:第三方应用如何被授权访问资源服务器。
整个流程参与者包括几个组成部分:
Resource Owner:资源拥有者,通常为终端用户
Resource Server:资源提供者
Authorization Server:授权服务器
Client:请求访问服务访问的应用
抽象的授权流程大致为:
在这里插入图片描述
假定一个在线音乐服务,用户zhangsan想通过某音视频播放软件来播放在线音乐,但是在播放音乐之前,该音视频软件必须通过YuFu(即玉符IDaaS)认证授权,得到zhangsan的同意之后才能访问在线音乐。
在这个场景中,zhangsan为resource owner,在线音乐服务为resource server,某音视频播放软件为client,YuFu作为Authorization Server。
1.音视频软件向zhangsan发起授权请求,请求zhangsan同意访问在线音乐服务;
2.根据不同的授权模式,zhangsan同意该授权,且返回一个“授权”给音视频软件;
3.音视频软件携带zhangsan的授权,请求YuFu颁发一个access_token,用于访问在线音乐;
4.YuFu校验音视频软件自身的合法性之后,颁发access_token;
5.音视频软件携带access_token,代表zhangsan请求访问在线音乐;
6.在线音乐校验完access_token以后,提供音乐服务,播放器开始播放音乐
上述是一个抽象的授权流程,而在具体实现中,在前三步中会有几个变种,即不同的授权模式,常见的授权模式包括:
Authorization Code Grant: 授权码模式,最为常用,最安全,强烈推荐;
Implicit Grant: 适用于SPA应用,已经不再推荐使用,被PKCE模式所替代;
Resource Owner Password Credentials Grant: 需要把用户的用户名和密码暴露给Client;
Client Credential Grant: 整个流程没有用户的概念,适用于服务端->服务端调用的场景。
可以发现在整个流程中,音视频播放软件并不需要知道zhangsan的密码,只是需要得到zhangsan的授权就可以访问在线音乐,整个授权由Authorization Server来负责的
本文并不会展开讨论Authorization Code模式,详细协议文档定义请参考:
https://tools.ietf.org/html/rfc6749
笔者意见:相比CAS协议,OAuth2.0不同的授权模式能够解决更多的场景,更安全、更流行,且通过PKCE模式能够实现移动端的单点登录,这个是其他SSO协议都不具备的。

OpenID Connect

OpenID Connect简称OIDC,是基于OAuth2.0扩展出来的一个协议。除了能够OAuth2.0中的Authorization的场景,还额外定义了Authentication的场景。
相比OAuth2,OIDC引入了id_token等和userinfo相关的概念:
整个OAuth2协议,只是定义了access_token/refresh_token,但是这俩token只是为了保护resource server的,并没有resource owner的身份信息。
OIDC引入id_token的概念,用这个特殊的token来表示这是resource owner的身份:
标准化id_token的格式:即大家熟知的JWT
标准化id_token的内容:standard claims
OIDC引入了关于如何获取详细userinfo的Endpoint;
OIDC定义了类似于SAML Metadata的Discovery接口,俗称well-known接口
OIDC协议的登陆授权流程和OAuth2.0基本类似, 整个流程的参与者也类似,只不过换了个术语:
OpenID Provider:简称OP,负责认证和授权
Replying Party:简称RP,OAuth2.0中的client
在这里插入图片描述
可以说OIDC协议是目前最主流的SSO标准协议,且对开发者友好,实现起来比较简单。
详细协议标准定义参考:
https://openid.net/specs/openid-connect-core-1_0.html

SAML2.0

SAML协议全称Security Assertion Markup Language,是一个基于XML的标准协议。SAML标准定义身份提供者Identity Provider和服务提供者Service Provider之间,如何通过SAML规范,采用加密和签名的方式来建立互信,从而交换用户身份信息。
SAML是一个非常古老的Authentication的协议,在早期B/S架构的企业级应用中非常流行。
SAML协议非常庞大,定义了很多optional的细节(不是必须实现)。但这个也是双刃剑,这一点恰恰也是SAML协议的缺点,作为实现者,必须得同时兼顾这些optional的细节,给开发者带来较大的挑战。
技术上,SAML协议基于XML,以assertion的方式,通过签名和加密交换用户身份信息,这一点和OIDC协议中的id_token类似(采用签名/加密的id_token来交换用户身份)
SAML流程的参与者包括Service Provider(SP)和Identity Provider(IDP)两个重要角色,且整个流程包括如下两个使用场景:
SP Initiated:服务提供者主动发起
IDP Initiated:身份认证服务器主动发起
下面是大致的认证流程:
在这里插入图片描述
1.End user从浏览器中请求访问某SP:https://www.example.com ;
2.https://www.example.com 发现用户未登录,则发起SAML的AuthnRequest请求至IDP,用户浏览器跳转至IDP页面;
3.IDP发现用户处于未登录状态,重定向用户至IDP的登录页面,请求用户进行身份验证
4.用户在登录页面中进行身份认证,通常情况下需要校验用户名和密码
5.IDP校验用户身份,若成功,则把包含着用户身份信息的校验结果,以SAML Response的形式,签名/加密发送给SP;
6.SP拿到用户身份信息以后,进行签名验证/解密,拿到明文的用户身份信息,此时SP处于登录状态,可以对用户提供服务;
可以看到,在整个流程中,IDP是负责颁发用户身份,SP负责信任IDP颁发的用户身份,SP和IDP之间的信任关系是需要提前建立的,即SP和IDP需要提前把双方的信息预先配置到对方,通过证书信任的方式来建立互信。
SAML协议的标准定义可参考:
http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html

各协议简单对比

上面简单介绍了主流的几种SSO协议,本质上它们大同小异,都是基于中心信任的机制,服务提供者和身份提供者之间通过互信来交换用户信息,只是每个协议信息交换的细节不同,或者概念上有些不同。

最后,通过一个简单对比表格来总结本文重点内容:
上面简单介绍了主流的几种SSO协议,本质上它们大同小异,都是基于中心信任的机制,服务提供者和身份提供者之间通过互信来交换用户信息,只是每个协议信息交换的细节不同,或者概念上有些不同。

最后,通过一个简单对比表格来总结本文重点内容:
在这里插入图片描述

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

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

相关文章

浏览器网络请求——HTTP详解

文章目录 HTTP 是什么HTTP 发展历程HTTP 1.0HTTP 1.1HTTP 2.0 常用方法头部信息 (Headers)请求头(request Headers响应头(response Headers) 状态码HTTP无状态理解:cookie与session总结 HTTP 是什么 HTTP(Hyper Text T…

【Linux】2.4 第一个小程序——进度条(C语言)

文章目录 character缓冲区的问题:ps. sleep 函数 倒计时进度条1.打印进度条2.让进度条“动起来”3.预留进度条的位置并用提示符显示进度条的状态4.颜色打印只用颜色来表示进度条 character 回车 与 换行 键盘上的 Enter 键: 换行的过程: …

程序员如何成为一名独立开发者?

这里有一个最简单粗暴的方式让你确定你是否能成为一个独立的开发者。 Lv.1 顺畅地完成一个独立外包项目 一个最低成本的试错方式就是去独立地完成一个外包项目,一般来说外包项目的难度较低,但也具有作为开发者必备的大多数流程,如果不确定自…

ChatGPT+小红书爆文,牛!

随着AI技术的不断发展,它已经逐渐渗透到了我们的生活之中,包括内容营销领域。 我们通过AI算法生成文本、优化搜索引擎排名、提高用户体验等,现在AI已逐渐在改变时代的进步,AI也将成为下一个十年的一个变革。我们每个创业者、内容…

Go的开发工具

Go的开发工具 1.VSCode 开源地址: GitHub - microsoft/vscode: Visual Studio Code 官网:https://code.visualstudio.com 好处是免费的,插件多!!! 2.GoLand 收费,是和IDEA是类似的,非常强。…

零基础转行从事云计算运维工作,不得不掌握的几项技能

转行云计算运维已成为今年热门话题之一,面对内卷严重的Java领域,虽然高薪有前景,但是很多人都是望而止步,自己的实力不允许自己卷入这场“高薪职业争夺战”。于是新的IT热门转行职业云计算被重点关注,它会不会成为下一…

如何使用SCQA模型提高表达能力

SCQA架构是“结构化表达”工具。 一、什么是“SCQA架构”?‍ S(Situation)情景——由熟悉的情境或事实引入 C(Complication)冲突——指出实际面临的困境或冲突 Q(Question)疑问——你如何分析…

【开发日志】2023.05 NormalMap Back To Sphere

【开发日志】2023.03.04 ZENO----SimpleGeometry----CreateSphere_EndlessDaydream的博客-CSDN博客CreateSpherehttps://blog.csdn.net/Angelloveyatou/article/details/129178914(4条消息) 【开发日志】2023.04 ZENO----Composite----CompNormalMap_EndlessDaydream的博客-CSD…

Linux-CentOS7安装Oracle11g 11.2.0.1.0

CentOS7安装Oracle11g 下载yum包更新RPM包解压安装包至tmp目录关闭selinux关闭防火墙创建Oracle用户修改内核配置文件创建安装目录和设置文件权限设置环境变量编辑静默安装响应文件安装打开一个新终端使用root用户登录启动监听建立数据库进程查询查看监听状态sqlplus登录设置开…

pgzero所有知识点详解

目录 什么是pgzero? pgzero的安装 4,正式开始! 1,调整背景色 2,导入角色 3,鼠标事件 5,按键事件 6,刷新功能 1,角色属性 2,功能介绍 7,…

Java面试 异常

文章目录 1. Java 异常类层次结构概览图2. Exception 和 Error 有什么区别?3. Checked Exception 和 Unchecked Exception 有什么区别?4. Throwable 类常用方法有哪些?5. try-catch-finally 如何使用?6. finally 中的代码一定会执…

chatGPT VS 科大讯飞星火大模型 使用初体验,到底谁更胜一筹?

下午这会有时间,正好之前申请了讯飞星火大模型的体验,这里就想着简单使用体验对比一下chatGPT和星火大模型的差异,废话不多说这里直接上图: 【诺特兰德叶黄素与纯天然蔬菜中的叶黄素有什么区别】 【今年六月份我就要参加高考了&am…

Python实战案例03

文章目录 1、归并排序2、角谷猜想3、兔子数列4、学生管理系统5、饮品自动售货机6、信息安全策略——文件备份7、用户账户管理1、归并排序 先将待排序的序列划分成若干长度为 1 的子序列,依次将两个子序列排序后合并成长度为 2 的子序列;再依次将两个子序列排序后合并成长度为…

基于Yolov8的道路缺陷检测,加入PConv、WIOU 、DCNV2提升检测精度

1.数据集介绍 缺陷类型:crack 数据集数量:195张 1.1数据增强,扩充数据集 通过medianBlur、GaussianBlur、Blur3倍扩充得到780张图片 按照train、val、test进行8:1:1进行划分 1.1.1 通过split_train_val.py得到trainval.txt、val.txt、test.txt # coding:utf-8import…

事件轮询EventLoop

JS 是一门单线程语言 (换句话说: 一个时间内我只能做一件事), 异步操作都是放到事件循环队列中, 等待主执行栈来执行 JS 是如何执行的 (执行顺序) ●从上往下, 一行一行执行 ●如果中间的某一行书写有误, 那么程序在运行到这一行会报错并停止向下继续运行 ●先把所有的同步代码…

15个对Web开发人员有用工具网站

1. 代码转图片 网址:https://carbon.now.sh/ 使用 Carbon 创建和分享源代码的精美图像。它提供了多种代码风格和主题。 3.图片图库 网址:https://unsplash.com/ 4. 智能 WebP、PNG 和 JPEG 图片压缩 网址:https://tinypng.com/ tiny…

SpringCloud00

服务调用方式 RPC和HTTP 无论是微服务还是SOA,都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢? 常见的远程调用方式有以下2种: RPC:Remote Produce Call远程过程调用,类似的还有 。自定义数据格式&am…

VSAN 7 安装部署指南(一)

本文使用三台服务器安装ESXI 7.0 ,并在其中一台ESXI中安装vCenter 7.0。本环境中最终在VMware Workstation虚拟机中做的嵌套虚拟化。每台虚拟机配置两块网卡,一块网卡桥接,一块NAT。三块硬盘,一块100GB作为系统盘,一块…

C++前序遍历(栈)

#include <stdio.h> #include <malloc.h> //树结构 typedef struct kl { int data; struct kl *lchild; struct kl *rchild; }bittree; //栈结构 typedef struct ji { int top; bittree **data; int size; }stack; //初始化栈 void in…

【PCIE体系结构十】链路两端的参考时钟有频偏怎么办?

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考书籍&#xff1a;《PCI.EXPRESS系统体系结构标准教材 Mindshare》 PCIE规范中…