单点登录、统一认证解决方案

2023-11-17

随着数字化的不断普及,大型公式或者单位的各个部门逐渐的上了与本身业务相关的各种各样的系统(在这些系统中,以 Web 系统居多),几乎每个系统都需要识别操作者的身份,并根据其不同的身份,分配一定的权限,做一些操作上的限制。结果很多公司或者部门都在各个系统便各自设计了一套用户资料和权限管理的机制,并提供了用户登录证认。这样满足了上面的需求,但由此带来和用户账号管理不方便,用户资料不统一等等问题。在数字化网络化发展到一定阶段时,对用户资料的整合起来,进行统一的管理变得十分必要。
本文的目的在探讨一个简单有效的方案,将有一定联系,拥有统一用户群的系统进行关联,统一用户的登录资料,并提供统一的登录认证入口。统一认证系统与不同应用子系统之间建立一定的信任关系,通过一定的渠道交换认证信息,在保证用户信息安全的基础上,实现认证关系的共享机制。使用户一个地方一次登录之后,便可以在相应的应用系统群中遨游,而不用没到一个系统就进行登录,甚至使用不同的账号和密码进行登录。
网站与用户之间的认证关系,我们一般通过Session来建立,而Session(一般)在不同网站中是不能共享的。本方案的难点在于统一认证系统和应用子系统之间认证信息的共享。用户在统一认证系统中登录之后,与统一登录系统建立了认证关系,如果用户转向应用子系统,此时如何与子系统建立认证关系,如何将统一认证系统的认证关系迁移复制到子系统,这将是我们要解决的问题。

ASP.NET的Session保存机制(会话状态模式)有三种......



ASP.NET 支持三种会话状态模式: 
InProc:In-Proc 模式将值存储在 ASP.NET 辅助进程的内存中。因此,该模式提供了对这些值的最快访问。但是,当 ASP.NET 辅助进程被回收时,状态数据便会丢失。 
StateServer:与上一模式不同,StateServer 模式使用独立的 Microsoft Windows 服务来存储会话变量。因为该服务独立于 Microsoft Internet Information Server (IIS),所以它可以在另一独立的服务器上运行。您可以将此模式用于负载平衡解决方案,因为多个 Web 服务器可共享会话变量。尽管在重新启动 IIS 时会话变量不会丢失,但在跨越进程边界时,性能会受到影响。 
SqlServer:如果会话信息的持久性对于您很重要,那么您可以使用 SqlServer 模式,以便利用 Microsoft SQL Server 来确保达到最高级别的可靠性。SqlServer 模式类似于进程外模式,只是前者的会话数据维护在 SQL Server 中。SqlServer 模式还让您能够利用位于 IIS 进程外的一个状态存储区,该状态存储区既可位于本地计算机上,也可位于远程服务器上。

网站的默认Session状态模式应该是InProc,限制了本系统网站使用。StateServer和SqlServer都作为扩展,将会话信息存储在IIS进程之外,实现了不同Web服务器之间的共享。当然,这两种模式都需要做相应的配置和消耗一定的性能,我们暂且不说这一点。仔细研究发现,这两种扩展模式主要面向的是网站的分流和负载均衡,共享Session的网站之间的结合是非常非常密切的,并且ASP.NET将所有的实现都进行了封装,我们无法获取和记录每一次共享的细节。这并不适合我们最开始的需求。
假设:A系统通过Session保存了一个User实例,那么如果B系统需要使用这个Session,则必需拥有A系统中User的细节。如果A、B两个系统是完全不同,甚至其中不同细节User类,更甚至A、B系统中都不只一处功能使用到Session,Session的命名又总碰巧一致。呵呵,那一切将变得不可思议。当然,如果我A、B为统一个系统的两个不同的应用层,那StateServer和SqlServer这两种方式将能够很好的满足需求。至于要满足我们上面的需求,只能是另外想办法了。

寻找解决办法,我们比较关系用户体验,那么先从用户的使用流程开始.......




根据我们的需求,用户的体验一般有两种:
一、对于使用多个子系统的用户,将有可能直接登录统一认证系统,并通过统一系统的子系统连接列表,跳转到多个子系统;二、对于一些使用单个子系统,或者自为单具体事情进入我们平台,或者是登录超时了,这是他应该向直接进入特定子系统,那么我们需要将登录验证在他进入子系统之前插入。两种不同方式的三个系统之间的交互过程如下图所示:


图 1. 一般步骤,同时登录多个子系统


图 2. 直接进入子系统,子系统之间跳转

我将按照第一种交互方式进行解释:
1、用户先与统一登录系统进行交互,使用唯一的帐号密码进行登录,此时不涉及任何子系统;
2、用户登录成功后,统一登录系统将信任的应用子系统列表呈现给用户;
3、用户根据需要,选择子系统连接访问子系统,用户与子系统的交互开始;
4、由于用户与子系统此时还没有建立认证关系,所以子系统将用户重定向到统一登录系统;
5、统一登录系统验证用户的登录信息,发现用户已经登录,便将登录信息插入到数据库,再将验证信息发给用户,即返回一个等待页面;
6、用户将等待页面中的验证信息提交(自动)到子系统,子系统获取认证信息;
7、子系统通过一定的办法和等待页面中的验证信息进行验证,并与用户建立了信任关系;
与ASP.NET封装的实现方案项目,这交互过程看起来十分烦碎,我们还需要自己实现大量的功能。但我们的交互实现过程都是可控的,各个系统之间传递的信息内容,什么时候传递,我能都可以限制和约定,并且能够将每一次系统之间的交互记录都进行登记,这才是我们需要的。至于烦碎,其实对用户来说,增加的步骤就是出现自动提交的等待登录页面,如果两个系统都能正常运行,网络也没有出现堵塞,用户等待的时间将及其短暂,甚至没能看到页面。并且我们能够对等待页面做一定的美化,使用户就算看到等待页面,也不会感到厌烦。

说了这么多,统一认证系统的应用子系统Session的共享还没有开始,这是本方案最大的难点......



下面就简述统一认证系统的应用子系统Session的共享的实现,我和一位同事根据大伙的讨论结果,分两种方式进行实现,详细情况如下:

第一种方式:通过MD5加密随机字符串,使用了Web服务实现了子系统和统一认证系统之间的交互验证。验证信息包含两部分用户在统一登录系统的Session ID和数据库中的随机ID。当子系统将用户重定向到统一登录系统的时候,验证的交互过程开始,详细步骤如下:
1、统一登录系统获取用户的Session ID和登录名
2、统一登录系统将Session ID和登录名插入到数据库,产生一个随机的数据库ID
3、将Session ID和数据库ID结合起来,进行MD5加密
4、使用MD5密文和数据库ID构建一个登录等待页面,返回给用户
5、用户将登录等待页面中的信息自动提交给子系统
6、子系统通过Web服务将MD5密文和数据库ID提交回统一登录系统
7、统一登录系统查询数据库,并进行验证
8、统一登录系统返回用户登录名,并删除数据库中的登录记录。
9、子系统与用户建立认证关系


图 3. MD5随机加密,Web服务实现验证


第二种方式:通过对认证信息(登录令牌)进行非对称加密,一次交互实现验证。验证信息为一个包含了产生时间的Token类。验证的交互过程同样是在重定向到统一登录系统的时候开始,详细步骤如下:
1、构建一个包含生成时间的Token类,将Token类序列化
2、使用SHA-1,对序列化Token编码进行散列,产生验证码H
3、将序列化Token编码和验证码H结合,使用公钥加密
4、使用密文构建一个登录等待页面,返回给用户
5、用户将登录等待页面中的信息自动提交给子系统
6、子系统使用私钥进行解密
7、子系统分离出散列验证码H和序列化Token编码,并进行SHA-1验证
8、检查Token中的生成时间,判断是否超时
9、子系统与用户建立认证关系


图 4. 非对称加密,一次交互实现验证

两种方式各有优缺点,大家很明显就能看出,我就不做总结。我们最终选择的方案是第一种,并且在验证过程中增加了一个Session识别子系统,防止非法的阻塞和冒充。即在应用子系统将用户重定向到统一认证系统系统时,子系统与用户建立Session,并在用户转交认证信息时,验证是否原本用户。防止有非法者获取了和用户转交的认证信息,并在用户之前提交给子系统,骗取认证。





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单点登录、统一认证解决方案 的相关文章

  • C++学习教程大纲

    以下是C 学习教程的大纲 第一部分 基础知识 C 简介 什么是C C 的历史 C 的特点和优势 开发环境的搭建 安装C 编译器 配置开发环境 第一个C 程序 Hello World程序 程序的结构 编译和运行程序 数据类型和变量 基本数据类

随机推荐

  • jQuery的三种$()

    号是jQuery 类 的一个别称 构造了一个jQuery对象 所以 可以叫做jQuery的构造函数 个人观点 呵呵 1 可以是 expresion 即css选择器 Xpath或html元素 也就是通过上述表达式来匹配目标元素 比如 a 构造
  • 应急响应篇:windows入侵排查

    前言 应急响应 Incident Response Service IRS 是当企业系统遭受病毒传播 网络攻击 黑客入侵等安全事件导致信息业务中断 系统宕机 网络瘫痪 数据丢失 企业声誉受损 并对组织和业务运行产生直接或间接的负面影响时 急
  • 《码上行动:零基础学会Python编程》书籍分享

    Python是一种高级的 面向对象的编程语言 由Guido van Rossum于1991年开发 它具有简洁 易读和可维护的语法 被广泛用于科学计算 Web开发 数据分析 人工智能等领域 以下是Python的一些特点和优势 简洁易读 Pyt
  • 还对Flutter理解不透?看完这些迟早成为大佬~

    Flutter是什么 Flutter简介 Flutter是谷歌的移动UI框架 可以快速在iOS和Android上构建高质量的原生用户界面 一份代码可以同时生成iOS和Android两个高性能 高保真的应用程序 Flutter目标是使开发人员
  • 2023年最火副业:Python爬虫兼职,一周赚7800元,一天只要两小时 !

    现在学习python的人越来越多了 跟大家简单如何利用python搞副业赚钱的 想要利用 Python 赚钱的方式还是比较多的 其中接单和投稿算是两种比较简单的方式了 如果你是业余学python爬虫 可以去淘宝上加了找了几个店铺直接问需要爬
  • 数据结构和算法(4):栈与队列

    栈 ADT 及实现 栈 stack 是存放数据对象的一种特殊容器 其中的数据元素按线性的逻辑次序排列 故也可定义首 末元素 尽管栈结构也支持对象的插入和删除操作 但其操作的范围仅限于栈的某一特定端 也就是说 若约定新的元素只能从某一端插入其
  • 文本域左边的文字处理

    文本域左边文字默认是bottom 如果想要左边文字与文本域顶部平齐 那么只需要设置label的vertical align的属性值为top即可 设置前 设置后
  • 代码分析(一)

    2021SC SDUSC 分析前言 对于APIJSON的代码分析首先就是 看一下该项目的作用以及如何进行 看一下原来不部署这个项目的正常流程 再来看一下部署上APIJSON后项目的流程走向 接下来开始按照这个流程对相应的代码进行分析 Abs
  • windows xcopy 复制文件夹命令 覆盖 或 跳过

    xcopy 拓展的复制命令 复制目录和下面的文件 保持目录结构 不能复制系统文件 隐藏文件 xcopy 源路径 目标路径 常用 复制并且覆盖 xcopy y srcPath dstPath 复制目录和目录下文件并且对目录下的子目录和子目录的
  • 一款好用的国产软件源代码缺陷分析平台 — CodeSense

    CodeSense是新一代的软件源代码缺陷深度分析平台 包含多个自研的代码分析引擎 同时提供开放的方案 支持多种商业 开源分析引擎集成并对结果进行集中展示 与目前市面的国外商业工具对比 在语言种类 功能 标准 缺陷分类数量上 已达到一致 额
  • 论文阅读-Training a Helpful and Harmless Assistant withReinforcement Learning from Human Feedback

    一 论文信息 论文名称 Training a Helpful and Harmless Assistant withReinforcement Learning from Human Feedback Github GitHub anthr
  • JavaWeb - 仿小米商场(4):首页商品分类展示

    JavaWeb 仿小米商场 4 首页线路分类展示 1 功能描述 接上篇JavaWeb 仿小米商场 3 登录与退出本篇博客将分析和实现旅游线路分类内容的查询和展示 此功能旨在控制 banner 顶部的展示内容 如以下H5页面所示 2 功能分析
  • Uniapp零基础开发学习笔记(9) -媒体组件音视频摄像头等的练习使用

    Uniapp零基础开发学习笔记 9 媒体组件音视频摄像头等的练习使用 基础组件部分 最后就只剩余媒体组件以及地图 和画布Canvas 以及浏览器组件web view 此次先看看媒体组件 重点学习前面几个 链接如下 https uniapp
  • 在Vue中当执行this.$emit() 时发生了什么?this.$emit() 的调用是异步的吗?

    当在Vue组件中调用this e m i t 时 实 际
  • 局域网设计

    一 局域网设计模型 1 局域网设计原则 考察物理链路 物理链路的带宽是网络设计的基础 分析数据流的特征 明确应用和数据流的分布特征 可以更加有效地进行资源分布 例如 企业邮件服务和工作组共享打印对于网络的需求是不一致的 采用层次化模型进行设
  • 【语义分割】【CVPR2022】BAM Note

    Topic 这是一篇CVPR 2022 Oral Paper 让我们继续体会小样本分割的魅力 Abstract 近年来 少镜头分割技术得到了广泛的发展 以往的工作大多试图通过分类任务的元学习框架来实现泛化 然而 训练的模型偏向于所见的类 而
  • Matlab相关性分析

    1 线性回归R方法 通过计算R方来看每个变量间的相关性 代码如下 X ones length X pre 1 X pre 注意 要计算具有常数项 截距 的模型的系数估计值 请在矩阵 X 中包含一个由 1 构成的列 b bint r rint
  • jwt超详细配置和教程

    一 什么是jwt jsontoken 在各方之间以json对象安全的传送信息 此信息可以验证和信任因为它是数字签名的 从分布式认证流程中 我们不难发现 这中间起最关键作用的就是 token token的安全与否 直接关系到系统的 健壮性 这
  • 关于Lazyload加载图片几种方法的介绍

    Lazyload长页面图片的延迟加载 一 jquery lazyload js 注意事项 jquery js务必先引进 然后才加载lazyload img长宽一定要有 每幅长宽可以不一致 在js段 可以不用 window ready来加载事
  • 单点登录、统一认证解决方案

    随着数字化的不断普及 大型公式或者单位的各个部门逐渐的上了与本身业务相关的各种各样的系统 在这些系统中 以 Web 系统居多 几乎每个系统都需要识别操作者的身份 并根据其不同的身份 分配一定的权限 做一些操作上的限制 结果很多公司或者部门都