手撕公司SSO登录原理

Single Sign-on

  SSO是老生常谈的话题了,但部分同窗对SSO可能掌握的也是云里雾里,只知其一;不知其二。本次手撕公司的SSO登录原理,试图以一种简单,流畅的形式为你提供 有用的SSO登录原理。web

  按照本人一向行文风格,咱们先说什么是SSO,为何要提出SSO?api

SSO: 在多个系统中,只须要登录一次,就能够访问其余相互信任的应用系统, 这个技术的提出解决了:浏览器

  • 企业运行了多个服务,而帐号须要集中统一管理cookie

  • 终端用户登录一次,便可使用一个帐户享受全部不一样域名下服务。spa

 SSO 与CAS(Central Authentication System)这个概念密切相关,帐户集中由某个服务管理,SSO服务只负责登录认证。code

   登录认证与【服务端在浏览器上写入的认证Cookie】密切相关, Cookie 有一系列重要属性:Domain,Path, Expiration,HttpOnly 决定了该Cookie 在客户端的做用域、做用范围、有效事件、有效操做方式blog

原理

 

用户首次访问 website1

① 用户访问website1 系统,website1系统须要认证, 用户当前没有登录事件

② website1给客户端返回302重定向响应, 客户端重定向到SSO服务页作用域

# 交互过程确实是临时跳转,下面传参false, 返回302临时重定向响应 域名

  context.Response.Redirect(ssoURL, false);

       用户并无登录SSO系统,因此SSO系统会返回登录界面

③ 用户在SSO登录界面输出帐户/密码

④ 登录成功,SSO会在客户端写入一个 cookie for sso并产生一个301重定向响应,客户端将重定向到原website1地址,该请求附带了SSO给与此次认证成功的 ticket

      http://www.website1.com?ticket=XXXX-OOOO-XXXX-OOOO

⑤ website1收到以上重定向请求,解析QueryString中的ticket, 向SSO作一次ticket验证; 验证经过向客户端写入本站的 cookie for website

⑥ 上面第5步,浏览器地址会显示:http://www.website1.com?ticket=XXXX-OOOO-XXXX-OOOO, 在本站验证经过以后,最好再作一个重定向,返回业务首页:www.website1.com, 本步骤不是SSO登录的标准流程。

 

以后用户访问website2

① 用户访问website2, 用户在website2并没获得认证;跳转回 SSO

② SSO服务检测到该 用户在SSO域下存在Cookie for sso, 认定该用户已经登录,故跳转回website2, 如上也会携带认证ticket

③ 如上,website2收到 website2.com?ticket=XXXX-OOOO-XXXX-OOOO请求, 会作一次SSO验证; 验证成功,写入本站cookie for website2

 

重难点解释

① SSO认证成功,写入的cookie for sso, 是登录到其余系统的关键

② website1收到SSO认证成功的重定向请求,解析出 ticket=XXXX-OOOO-XXXX-OOOO, 为何还要作一次SSO验证?

    由于website1收到的来自SSO的重定向请求地址,有多是伪造, 因此在website1中须要去SSO验证一次。

③ 标准的CAS登录流程有两次302客户端重定向, 分别由原站点website1和SSO启动。

  理论上 整个流程由服务端重定向也是能够的 ?? 看官若发现有漏洞,可在评论区回复。 

④ 退出SSO登录, 要作两件事情:

     - 向SSO发起api请求,请求SSO删除用户在SSO域下的认证cookie for sso

     - 移除本站的cookie for website1

⑤ 每一个website,至少须要以下sso配置     

  "SsoOptions": {
    "BaseAddress": "https://sso-cas.sso.com",       // 基地址
    "LoginPath": "/login",                             // sso登录地址
    "LogoutPath": "/api/logout",                       // 退出sso登录的api地址
    "ValidateTGTPath": "/api/validate",                // 验证ticket的api地址 
    "UserInfoPath": "/api/v2/userinfo"                 // 从sso拿到登录用户信息的api地址
  },

 

That' all,这是本身对SSO登录的一些理解, 本图文 但愿以流畅的思路记录SSO, 但愿各位看官不要吃快餐,知其然更知其因此然很关键。 

相关文章
相关标签/搜索