单点登录( Single Sign-On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要 登录一次 就可以访问所有相互信任的应用系统(一次访问,到处运行)。

单点登陆通俗的讲就是要解决如何产生和存储那个信任,以及其他系统如何验证这个信任的有效性;

单点登录的要点:1.存储信任;2.服务器生产以及验证信任;3.拿到之后服务器再次验证;

SSO原理

SSO体系中的角色

  1. User(多个)
  2. Web应用(多个)
  3. SSO认证中心(1个)

SSO实现模式的原则

  1. 所有的认证登录都在SSO认证中心进行;
  2. SSO认证中心通过一些方法来告诉Web应用当前访问用户究竟是不是已通过认证的用户;
  3. SSO 认证中心和所有的 Web 应用建立一种信任关系,也就是说 web 应用必须信任认证中心。(单点信任)

SSO主要实现方式

  1. 共享cookies

    基于共享同域的cookie是Web刚开始阶段时使用的一种方式,它利用浏览同域名之间自动传递cookies机制,实现两个域名之间系统令牌 传递问题;另外,关于跨域问题,虽然 cookies本身不跨域,但可以利用它实现跨域的SSO。如:代理、暴露 SSO 令牌值等。

  2. Broker-based(基于经纪人)

    在 这种解决方案中,有一个自动地为不同的应用程序认证用户身份的代理程序。这个代理程序需要设计有不同的功能。比如,它可以使用口令表或加密密钥来自动地将 认证的负担从用户移开。代理人被放在服务器上面,在服务器的认证系统和客户端认证方法之间充当一个 “ 翻译 “。例如 SSH 等。

  3. Agent-based(基于代理人)

    在 这种解决方案中,有一个自动地为不同的应用程序认证用户身份的代理程序。这个代理程序需要设计有不同的功能。比如,它可以使用口令表或加密密钥来自动地将 认证的负担从用户移开。代理人被放在服务器上面,在服务器的认证系统和客户端认证方法之间充当一个 “ 翻译 “。例如 SSH 等。

  4. Token-based

    例如 SecureID,WebID,现在被广泛使用的口令认证,比如 FTP 、邮件服务器的登录认证,这是一种简单易用的方式,实现一个口令在多种应用当中使用。

  5. 基于网关

  6. 基于 SAML

    SAML(Security Assertion Markup Language ,安全断言标记语言)的出现大大简化了 SSO ,并被 OASIS 批准为 SSO 的执行标准 。开源组织 OpenSAML 实现了 SAML 规范。

主要常见技术

  1. CAS(单点登录)

  2. OAuth2(第三方登录授权:QQ登录)

  3. JWT(客户端token:原生)

  4. 安全控制框架:

    • Spring-Security
    • Shiro

CAS(单点登录)

简介

CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的、开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(属于 Web SSO )。

结构体系

主要特性

  1. 开源、多协议的SSO解决方案;Protocols :Custom、Protocol、CAS、OAuth、OpenID、RESTful API、SAML1.1、SAML2.0 等;
  2. 支持多种认证机制:Active Directory、JAAS、JDBC、LDAP、X.509 Certificates 等;
  3. 安全策略:使用票据( Ticket )来实现支持的认证协议;
  4. 支持授权:可以决定哪些服务可以请求和验证服务票据(Service Ticket);
  5. 提 供高可用性:通过把认证过的状态数据存储在 TicketRegistry 组件中,这些组件有很多支持分布式环境的实现, 如: BerkleyDB、Default、EhcacheTicketRegistry、JDBCTicketRegistry、JBOSS TreeCache、JpaTicketRegistry、MemcacheTicketRegistry 等;
  6. 支持多种客户端: Java 、 .Net 、 PHP 、 Perl 、 Apache, uPortal 等。

解决问题

多个系统只需要登录一次,无需重复登录

原理

授权服务器,被授权客户端CS架构

  1. 授权服务器保存了全局的一份session,客户端(多个)格子保存自己的session;
  2. 客户端登录时判断自己的session是否已登录,若未登录,则(告诉浏览器)重定向到授权服务器;(参数带上自己的地址,用于回调)
  3. 授权服务器判断全局的session是否已登录,若未登录则定向到登录页面,提示用户登录,登录成功后,授权服务器重定向到客户端(参数带上ticket[一个凭证号]);
  4. 客户端收到ticket后,请求服务器获取用户信息;
  5. 服务器同意客户端授权后,服务端保存用户信息至全局session,客户端将用户保存至本地session;
  6. 默认不支持http请求,仅支持https,生成整数keytools;

缺点:CAS单点登录技术适用于传统应用的场景比较多,官方示例也是以JavaWeb为准,对微服务化应用,前后端分离应用,支持性较差。

参考地址:

  1. https://juejin.cn/post/6844904155161559048
  2. https://juejin.cn/post/6844904038555729927
  3. https://blog.csdn.net/u012702547/article/details/105699777
  4. https://www.toutiao.com/i6765428664424202763/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1&timestamp=1609846862&app=news_article&utm_source=weixin&utm_medium=toutiao_ios&use_new_style=1&req_id=20210105194102010130036140440A5C55&group_id=6765428664424202763