单点登录的实现原理

深入了解 OpenIddict实现 OAuth 2.0 和 OpenID Connect 协议的 .NET 库 OpenIddict 是一个强大且易于集成的 .NET 库,专为 OAuth 2.0 和 OpenID Connect 协议的实现而设计。无论你是构建一个简单的认证系统,还是需要支持复杂的授权和认证场景,OpenIddict 都能提供高效的解决方案。通过其与 ASP.NET Core 的深度集成,开发者可以快速实现现代化的身份验证系统,保证系统的安全性和灵活性。通过本文的介绍,你可以快速上手 OpenIddict,在你的应用中实现完整的认证与授权机制,为用户提供安全、可靠的身份验证服务。 阅读详情

目录

一、共享Session

二、基于OpenId的单点登录

三、基于Cookie的OpenId存储方案

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

五、安全问题


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

一、共享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/SB/S相结合的系统,流程如下:

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

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

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

   3、客户端进行存储;

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

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

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

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

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

  三、基于CookieOpenId存储方案

  我们知道,Cookie的作用在于充当一个信息载体在Server端Browser端进行信息传递,而Cookie一般是以域名为分割的,例如a.xxx.comb.xxx.comCookie是不能互相访问的,但是子域名是可以访问上级域名的Cookie的。即a.xxx.comb.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失效所有终端验证都失效的情况

OAuth2/OIDC实战:用OpenIddict实现.NET Core单点登录系统 *授权服务器(Authorization Server)**:颁发访问令牌。**资源服务器(Resource Server)**:托管受保护资源。**资源所有者(Resource Owner)**:通常是终端用户。动态注册(Dynamic Registration)**客户端(Client)**:请求访问资源的应用。发现(Discovery):动态配置。核心(Core):定义基本功能。客户端凭证模式(服务间通信)标准声明(claims)授权码模式(最安全)隐式模式(逐渐淘汰)UserInfo端点。 阅读详情

相关推荐

通过OpenIddict设计一个授权服务器01-介绍

通过OpenIddict设计一个授权服务器01-介绍

qq_36437991的博客 1606

openiddict-samples, OpenIddict的ASP.NET 核心/javascript示例.zip

openiddict-samples, OpenIddict的ASP.NET 核心/javascript示例 OpenIddict.Samples演示如何使用 OpenIddict 和不同 oauth2/openid连接流的内核示例示例。支持需要帮助或者想分享你的想法? 请不要犹豫加入或者问你StackOverflow的问题:Gitte

通过OpenIddict设计一个授权服务器03-客户凭证流程

通过OpenIddict设计一个授权服务器03-客户凭证流程

qq_36437991的博客 3495

ABP框架之OpenIddict分布式认证授权学习手册v1.0

快进来,带你入坑~~~

单点登录涉及的技术点

OAuth 2.0是一个授权(Authorization)框架,它将用户身份验证委托给托管用户帐户的服务提供商,并授权第三方应用程序访问用户帐户。OAuth 2.0为web应用程序、桌面应用程序和移动设备提供授权流。 通过引入授权层,OAuth 2.0将客户机的角色与资源所有者或最终用户分离。如果客户端请求访问由最终用户控制并由资源服务器托管的资源,而不是使用最终用户的凭据访问受保护的资源,则客户端将获得一个访问令牌。在最终用户的批准下,授权服务器将向请求客户端颁发访问令牌。...

hhhhhhenrik的博客 5073

单点登录原理实现

一,背景 单点登录顾名思义就是在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统,免除多次登录的烦恼。比如我们登录了百度账号,再去百度百科,百度文库就不需要再次登录了。 二,原理说明 单点登录主流都是基于共享 cookie 来实现的,下面分别介绍 同域 和 跨域 下两种场景具体怎样实现共享cookie的。 2.1. 同域单点登录 适用场景:都是企业自己的系统,所有系统都使用同一个一级域名通过不同的二级域名来区分。 举个例子:公司有一个一级域名为 xxx.com ,我们有三个系统分

MrLee的博客 7198

单点登录原理实现方式

单点登录的英文名叫做:Single Sign On(简称SSO),指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的系统。简而言之,多个系统,统一登陆。 为什么需要做单点登录系统呢?在一些互联网公司中,公司旗下可能会有多个子系统,每个登陆实现统一管理,多个账户信息统一管理 SSO单点登陆认证授权系统。

qq_41595452的博客 6万+

单点登录原理与简单实现 以及单点登录的三种实现方式

单点登录原理与简单实现 一、单系统登录机制 1、http无状态协议   web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次请求/响应对之间没有任何联系   但这也同时意味着,任何用户都能通过浏览器访问服务器资源,如果想保护服务器的某些资源,必须限制浏览器...

家有代码初写成 的博客 9934

单点登录原理实现

一、单系统登录机制1、http无状态协议web应用采用browser/server架构,http作为通信协议。http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关联,这个过程用下图说明,三次请求/响应对之间没有任何联系但这也同时意味着,任何用户都能通过浏览器访问服务器资源,如果想保护服务器的某些资源,必须限制浏览器请求;要限制浏览器请求,必须鉴别浏览器请求,响应合法请求,忽略非法请求;要鉴别浏览器请求,必须清楚浏览器请求状态。

m0_73202019的博客 2487

openIddict-practice:OpenIddict身份验证服务练习

openIddict-practice:OpenIddict身份验证服务练习

单点登录实现的几种方式及原理单点登录

文章目录一、什么是单点登录二、单点登录原理三、单点登录实现方式1.基于Cookie+Redis的单点登录2.分布式session方式实现单点登录3.token验证4.session广播5.CAS 中央认证服务 一、什么是单点登录 单点登录的英文名叫做:Single Sign On(简称SSO),指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的系统。简而言之,多个系统,统一登陆。 为什么需要做单点登录系统呢?在一些互联网公司中,公司旗下可能会有多个子系统,每个登陆实现统一管理,多个

世上哪有什么岁月静好,不过是有人替你负重前行 4万+

单点登录sso原理及代码实现

什么是单点登录 一个账户在多个系统上实现单一用户的登录 为什么用单点登录 单点登录可以做到在不记录用户密码的情况下,实现不同系统之间的资源共享,自动登录不安全,单点登录,一处登录,处处都可用,不用做多余的登录操作 引用一个很经典的案例 比如现在有OA系统、门户系统、人力资源管理系统、档案管理系统、生产管理系统、xx系统等,这么多个系统在一个公司里面,如果一个用户需要使用这么多个系统,那每天都要登录...

IT界的一只菜鸟 6110

单点登录原理及简单实现

  1  单点登录原理与简单实现 2  关于redis实现单点登录的一点思路    

延宝小白马的博客 1445

单点登录原理与简单实现

单系统登录机制-用户向sso认证中心提交注销请求,sso认证中心注销全局会话,但不知道哪些系统用此全局会话建立了自己的局部会话,也不知道要向哪些子系统发送注销请求注销局部会话。

jakeswang的博客 1382

单点登录原理及JWT实现

官方:JSON Web Token (JWT) is an open standard (RFC 7519HMACRSAorECDSAJSON Web 令牌(JWT)是一种开放标准(RFC 7519) ,它定义了一种紧凑和自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。可以验证和信任此信息,因为它是数字签名的。JWTs 可以使用 secret (使用 HMAC 算法)或使用 RSA 或 ECDSA 的公钥/私钥对进行签名。

来xghuang666的专栏 712

OpenIdDict 授权

【代码】OpenIdDict 授权。

极客神殿 1469
上一篇: Mysql-如何正确的使用索引以及索引的原理
下一篇: java十六大常用工具类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值