单点登录:一把钥匙开启所有门

2024-03-19 03:20

本文主要是介绍单点登录:一把钥匙开启所有门,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

单点登录(SSO)技术,就像是一把开启企业数字化大门的钥匙,让用户一次登录,随处访问,极大地提升了工作效率和用户体验。具体到技术实现上,当用户首次登录时,SSO系统会进行认证,并发放一个凭证(如Token)。当用户尝试访问其他服务时,只需出示这个凭证,而无需再次输入账号密码。这不仅加快了工作流程,还大大减少了因记不住密码而导致的安全风险。

SSO解决方案

单点登录的核心在于:在多个应用系统中,用户只需进行一次登录认证,就可以无缝访问所有相互信任的应用系统。这背后需要一个独立的认证中心,通常称为Passport。

当用户首次尝试访问任一应用系统时,系统会将用户引导至Passport进行认证。一旦认证成功,Passport就会颁发一个令牌给用户。随后,用户携带这个令牌访问其他系统时,无需再次登录,系统会识别该令牌,并授予用户相应的访问权限。

这里会涉及同域名及不同域名两种方式:

  • • 同域名下的SSO:依托Cookie的域属性,可以实现同一个主域名下的各子域应用间共享token,从而实现单点登录。

  • • 跨域名的SSO:对于不同域的应用,可以通过建立一个独立的认证中心,使用令牌机制来实现单点登录。

  • 下图就是针对跨域名的SSO的流程:

图片

在技术实现上,单点登录可以借助如 CAS(Central Authentication Service)、OAuth、OpenID Connect 等标准协议,也可以基于企业内部的自定义协议实现。在整个流程中,要维护一个全局认可的信任票证(token),并通过集中式的认证服务中心来进行身份的统一管理和验证。 CAS(Central Authentication Service)和OAuth 2.0(Open Authorization)都是在网络应用中广泛使用的认证和授权协议。

OAuth 2.0 (Open Authorization)

OAuth 2.0是一个授权框架,允许第三方应用获取对用户资源的有限访问权限,而无需获取用户的凭证。OAuth 2.0更注重授权而非认证。

使用场景:OAuth 2.0广泛应用于互联网服务中,允许用户授权第三方应用访问他们存储在其他服务提供商上的信息,例如我们通过微信授权登录一个小程序或者应用。

工作流程:用户授权第三方应用访问自己在另一个服务上的资源时,该应用将获得一个访问令牌。该令牌允许第三方应用代表用户访问其资源。这个在微信开放平台、支付宝等都有相关接入说明及接口,大家可以去参考下。主要流程如下:

图片

1. 用户请求客户端应用程序访问资源。

2. 客户端应用向授权服务器请求授权。

3. 授权服务器要求用户提供认证。

4. 用户向授权服务器提供认证。

5. 如果认证成功,授权服务器将授权码发送给客户端应用。

6. 客户端应用使用授权码向授权服务器请求访问令牌。

7. 授权服务器向客户端应用发放访问令牌。

8. 客户端应用使用访问令牌向资源服务器请求资源。

9. 资源服务器向客户端应用提供资源。

10. 客户端应用将资源显示给用户。

CAS (Central Authentication Service)

CAS是一种单点登录(SSO)协议,旨在允许用户在多个应用程序间使用单一的认证过程登录。它专注于解决用户认证问题,而不涉及授权。

使用场景:CAS通常用于单一组织或紧密相关组织的内部应用中,提供集中式的用户认证服务。

工作流程:用户首次尝试访问应用时被重定向到CAS服务器进行认证。一旦认证成功,用户就可以无需再次登录即可访问其他集成了CAS的应用。一般公司级的应用都会采用这种方式。

图片

用户未登录访问 app1

1. 用户访问 app1 的受保护资源,app1 发现用户未登录,跳转至统一认证中心,并将自己的地址作为参数

2. sso 认证中心发现用户未登录,将用户引导至登录页面

3. 用户输入用户名密码提交登录

4. 统一认证中心校验用户信息,创建用户与 sso 认证中心之间的会话 TGC,同时创建 Token

5. 统一认证中心带着 Token 跳转最初 app1 的请求地址,浏览器缓存 TGC 及 Token

6. app1 拿到 Token,去统一认证中心校验 Token 是否有效

7. 统一认证中心校验 Token,返回有效

8. app1 使用该 token 创建与用户的会话,返回受保护资源

用户已登录 app1 再次访问 app1

1. 请求携带 Token,app1 请求认证中心确认 Token 是否有效

2. app1 返回受保护资源

用户登录 app1 后访问 app2

1. 用户访问系统 2 的受保护资源,未携带 app2 的 Token

2. app2 发现用户未登录,跳转至统一认证中心登陆页,并将自己的地址作为参数

3. 登陆页拿到 TGC,判断已经登录,跳转到 app2 页面

4. 请求统一认证中心通过 TGC 换取 Token

5. 统一认证中心校验后,返回 Token

6. app2 使用该 Token 创建与用户的局部会话,返回受保护资源

总结

通过实施SSO,企业可以极大地简化用户的登录流程,加强数据安全,提高工作效率。无论是采用CAS还是OAuth 2.0,关键在于选择最适合企业自身需求和现有架构的解决方案。

这篇关于单点登录:一把钥匙开启所有门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/824624

相关文章

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

通过C#获取PDF中指定文本或所有文本的字体信息

《通过C#获取PDF中指定文本或所有文本的字体信息》在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响,然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文... 目录引言C# 获取PDF中指定文本的字体信息C# 获取PDF文档中用到的所有字体信息引言在设计和出

idea如何开启菜单栏

《idea如何开启菜单栏》文章介绍了如何通过修改IntelliJIDEA的样式文件`ui.lnf.xml`来重新显示被关闭的菜单栏,并分享了解决问题的步骤... 目录ijsdea开启菜单栏第一步第二步总结idea开启菜单栏手贱关闭了idea的js菜单栏,花费了半个小时终于解决,记录并分享一下第一步找

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

Collection的所有的方法演示

import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;public class TestCollection {/*** @param args* Collection的所有的方法演示* 此程序没有使用泛型,所以可以添加任意类型* 以后如果写到泛型会补充这一方面的内容*/public s