单点登录三个方法及原理:共享Session、基于OpenId的单点登录、基于Cookie的OpenId存储方案

article/2025/9/21 10:30:50

单点登录三个方法及原理:共享Session、基于OpenId的单点登录、基于Cookie的OpenId存储方案


 

        单点登录在现在的系统架构中广泛存在,他将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用不同的单点登录实现方案来满足需求。我将以我所遇到的应用环境以及在其中所经历的各个阶段与大家分享,若有不足,希望各位不吝赐教。

 

一、共享Session

  共享Session可谓是实现单点登录最直接、最简单的方式。将用户认证信息保存于Session中,即以Session内存储的值为用户凭证,这在单个站点内使用是很正常也很容易实现的,而在用户验证、用户信息管理与业务应用分离的场景下即会遇到单点登录的问题,在应用体系简单,子系统很少的情况下,可以考虑采用Session共享的方法来处理这个问题。

  

  这个架构我使用了基于Redis的Session共享方案。将Session存储于Redis上,然后将整个系统的全局Cookie Domain设置于顶级域名上,这样SessionID就能在各个子系统间共享。

  这个方案存在着严重的扩展性问题,首先,ASP.NET的Session存储必须为SessionStateItemCollection对象,而存储的结构是经过序列化后经过加密存储的。并且当用户访问应用时,他首先做的就是将存储容器里的所有内容全部取出,并且反序列化为SessionStateItemCollection对象。这就决定了他具有以下约束:

  1、  Session中所涉及的类型必须是子系统中共同拥有的(即程序集、类型都需要一致),这导致Session的使用受到诸多限制;

  2、  跨顶级域名的情况完全无法处理;

  

  二、基于OpenId的单点登录

  这种单点登录将用户的身份标识信息简化为OpenId存放于客户端,当用户登录某个子系统时,将OpenId传送到服务端,服务端根据OpenId构造用户验证信息,多用于C/S与B/S相结合的系统,流程如下:

 

  由上图可以看到,这套单点登录依赖于OpenId的传递,其验证的基础在于OpenId的存储以及发送。

   1、当用户第一次登录时,将用户名密码发送给验证服务;

   2、验证服务将用户标识OpenId返回到客户端;

     3、客户端进行存储;

   4、访问子系统时,将OpenId发送到子系统;

   5、子系统将OpenId转发到验证服务;

   6、验证服务将用户认证信息返回给子系统;

   7、子系统构建用户验证信息后将授权后的内容返回给客户端。

  这套单点登录验证机制的主要问题在于他基于C/S架构下将用户的OpenId存储于客户端,在子系统之间发送OpenId,而B/S模式下要做到这一点就显得较为困难。为了处理这个问题我们将引出下一种方式,这种方式将解决B/S模式下的OpenId的存储、传递问题。

  

  三、基于Cookie的OpenId存储方案

  我们知道,Cookie的作用在于充当一个信息载体在Server端和Browser端进行信息传递,而Cookie一般是以域名为分割的,例如a.xxx.com与b.xxx.com的Cookie是不能互相访问的,但是子域名是可以访问上级域名的Cookie的。即a.xxx.com和b.xxx.com是可以访问xxx.com下的Cookie的,于是就能将顶级域名的Cookie作为OpenId的载体。

  

  

  验证步骤和上第二个方法非常相似:

  1、  在提供验证服务的站点里登录;

  2、  将OpenId写入顶级域名Cookie里;

  3、  访问子系统(Cookie里带有OpenId)

  4、  子系统取出OpenId通过并向验证服务发送OpenId

  5、  返回用户认证信息

  6、  返回授权后的内容

  在以上两种方法中我们都可以看到通过OpenId解耦了Session共享方案中的类型等问题,并且构造用户验证信息将更灵活,子系统间的验证是相互独立的,但是在第三种方案里,我们基于所有子系统都是同一个顶级域名的假设,而在实际生产环境里有多个域名是很正常的事情,那么就不得不考虑跨域问题究竟如何解决。

  四、B/S多域名环境下的单点登录处理

   在多个顶级域名的情况下,我们将无法让各个子系统的OpenId共享。处理B/S环境下的跨域问题,我们首先就应该想到JSONP的方案。

 

  验证步骤如下:

  1、  用户通过登录子系统进行用户登录;

  2、  用户登录子系统记录了用户的登录状态、OpenId等信息;

  3、  用户使用业务子系统;

  4、  若用户未登录业务子系统则将用户跳转至用户登录子系统;

  5、  用户子系统通过JSONP接口将用户OpenId传给业务子系统;

  6、  业务子系统通过OpenId调用验证服务;

  7、  验证服务返回认证信息、业务子系统构造用户登录凭证;(此时用户客户端已经与子业务系统的验证信息已经一一对应)

  8、  将用户登录结果返回用户登录子系统,若成功登录则将用户跳转回业务子系统;

  9、  将授权后的内容返回客户端;

 

  五、安全问题

  经过以上步骤,跨域情况下的单点登录问题已经可以得到解决。而在整个开发过程初期,我们采用用户表中纪录一个OpenId字段来保存用户OpenId,而这个机制下很明显存在一些安全性、扩展性问题。这个扩展性问题主要体现在一个方面:OpenId的安全性和用户体验的矛盾。

  整个单点登录的机制决定了OpenId是会出现在客户端的,所以OpenId需要有过期机制,假如用户在一个终端登录的话可以选择在用户每次登录或者每次退出时刷新OpenId,而在多终端登录的情况下就会出现矛盾:当一个终端刷新了OpenId之后其他终端将无法正常授权。而最终,我采用了单用户多OpenId的解决方案。每次用户通过用户名/密码登录时,产生一个OpenId保存在Redis里,并且设定过期时间,这样多个终端登录就会有多个OpenId与之对应,不再会存在一个OpenId失效所有终端验证都失效的情况。

 


http://chatgpt.dhexx.cn/article/k4eHfuWu.shtml

相关文章

单点登录原理与实现方式

一、单系统登录机制 1、http无状态协议 web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次…

Shiro-单点登录原理

单点登录原理 一、单系统登录机制 1、http无状态协议 web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明…

单点登录原理以及简单实现

一、单系统登录机制 1、http无状态协议 web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次…

单点登录原理及代码实现

这次废话少说,直接扔干货,自己也是刚刚学习的单点登录,如有问题,还请评论进行一起探讨。 一、单系统登录机制 1、http无状态协议 web应用采用的B/S架构,http作为通信协议。由于http本身是无状态协议,不存…

单点登录(原理与代码)

文章目录 一、单点登录简介SSO 原理(单点登录的过程)SSO 实现技术SSO 常见方案 二、手写单点登录系统架构(代码篇)三、单点登录详介(原理篇)1.登录2.注销单点登陆的具体实现:1.sso-client拦截未登录请求2.s…

单点登录设计原理

本文以某新闻单位多媒体数据库系统为例,提出建立企业用户认证中心,实现基于安全策略的统一用户管理、认证和单点登录,解决用户在同时使用多个应用系统时所遇到的重复登录问题。 随着信息技术和网络技术的迅猛发展,企业内部的应用…

单点登录SSO的原理

思考: web系统早已从久远的单系统发展成为如今由多系统组成的应用群,面对如此众多的系统,用户难道要一个一个登录、然后一个一个注销吗? 当然不是,web系统由单系统发展成多系统组成的应用群,复杂性应该由系统内部承担&#xff0c…

单点登录原理与代码实现

GitHub:https://github.com/sheefee/simple-sso 一、单系统登录机制 1、http无状态协议 web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的…

单点登录的实现原理

转自:https://www.cnblogs.com/UliiAn/p/3803042.html https://blog.csdn.net/javaloveiphone/article/details/52439613 单点登录在现在的系统架构中广泛存在,他将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单…

单点登录原理与实现

用 10 张图给你说明白单点登录原理与实现 欢迎来到,德莱联盟! 今天盟主给你们讲一讲单点登录,还有它的具体实现。 一、单系统登录机制 1、http无状态协议 web应用采用browser/server架构,http作为通信协议。http是无状态协议&…

什么是单点登录?如何实现?

一、是什么 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一 SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统 SSO 一般都需要一个独立的认证中…

SSO单点登录原理详解

本文主要对SSO单点登录与CAS、OAuth2.0两种授权协议的关系和原理进行详细说明。 1. 基础概念 术语解释 SSO-Single Sign On,单点登录 TGT-Ticket Granting Ticket,用户身份认证凭证票据 ST-Service Ticket&#xf…

10.单点登录原理及JWT实现

单点登录原理及JWT实现 一、单点登录效果 首先我们看通过一个具体的案例来加深对单点登录的理解。案例地址:https://gitee.com/xuxueli0323/xxl-sso?_fromgitee_search 把案例代码直接导入到IDEA中 然后分别修改下server和samples中的配置信息 在host文件中配置 …

单点登录SSO的实现原理

单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。单点登录在大型网站里使用得非常频繁,例如…

单点登录原理及实现

一,背景 单点登录顾名思义就是在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统,免除多次登录的烦恼。比如我们登录了百度账号,再去百度百科,百度文库就不需要再次登录了。 二&#xf…

CGAL:学习CGAL

背景 CGAL是一个非常有用的库,但是学习起来非常痛苦。为此,我们计划通过一些小的demo,逐渐学习CGAL的使用方法。目前,由于我们还缺少对CGAL的整体把握,所以demo没有连贯性,且难度飘忽不定。不过随着我们的…

CGAL例程:点云数据三维重建

作者:西蒙吉罗多 链接:CGAL 5.4 - Manual: Surface Reconstruction from Point Cloudshttps://doc.cgal.org/latest/Manual/tuto_reconstruction.html 目录 2 我应该使用哪种算法? 3 管道概览 4 读取点云数据 5 点云预处理 5.1 异常值…

CGAL编译与配置

从来没有自己编译过第三方库,每次看到cmake上那些红色的错误就头疼,从来都是伸手党,不过这次没有要到编译好的CGAL,只能硬着头皮自己来。当编译完看到自己的例子跑通,才发现并没有想象中的复杂。 (此方法在win7和win1…

CGAL的使用

1 C++类的知识 因为CGAL是用C++实现的,所以需要先了解一下C++编程。C++是面向对象的编程,这也是C++对C语言改进的最重要的部分。C++也被叫做是"带类的 C"。简单讲一下类的构成,成员函数以及对象的定义和使用。 1.1 C++类的构成 首先从C的结构体说起。C中的结构体我想…

cgal配置以及一些资料

Win7下VS2008编译CGAL3.9 (转:http://blog.csdn.net/wsh6759/article/details/6977847) CGAL是比较经典的计算几何库,算法经典,稳定高效。 本文介绍编译CGAl情况, 前期准备: BOOST&#x…