[TOC] ## 概述 单点登录的英文全称是 Single Sign On,简称SSO。 即用户只需要登录一次,就可以在个人权限范围内,访问所有相互信任的应用功能模块,不管整个应用群的内部有多么复杂,对用户而言,都是一个统一的整体。 用户访问web系统的整个应用群与访问单个系统一样,登录和注销分别只要一次就够了 ### 设计原理 ![00EAA192-3A23-4F13-80E5-1447EF25E243.png](http://yanxuan.nosdn.127.net/6a08007675455722bb435d17dd041db2.png) * 用户系统 * * 负责用户名、密码等账户信息管理,包括增加、修改、启用、停用用户账号,同时为认证中心提供对用户名和密码的校验。 * 认证中心 * * 负责凭证 Token的生成、加密、颁发、验证、销毁、登入( Login)和登出( Logout)。用户只有在拥有凭证并验证通过的情况下才能访问企业门户。 * 权限系统 * * 负责角色管理、资源设置、授权设置、鉴定权限,具体实现可参考RBAC。权限系统可为企业门户提供用户权限范围内的导航。 * 企业门户 * * 作为应用系统的集成门户( Portal),集成了多个应用系统的功能,为用户提供链接导航、用户信息和登岀功能等。 ### SSO服务端功能 * 登录认证 * * 接收登录账号信息,让用户系统验证用户的登录信息。 * 凭证生成 * * 创建授权凭证 Token。生成的凭证一般包含用户账号、过期时间等信息,凭证是一串加密的字符串,如AES加密(凭证明文+MD5加密信息),可采用JWT标准。 * 凭证颁发 * * 与SSO客户端通信,发送凭证给SSO客户端。 * 凭证验证 * * 接收并校验来自SSO客户端的凭证有效性,凭证验证包括算法验证和数据验证两种。 * 凭证销毁与登出 * * 接收来自SSO客户端的登岀请求,记录并销毁凭证,跳转至登录页面。 ### SSO客户端功能 * 请求拦截 * * 拦截应用的未登录请求,跳转至登录页面。 * 获取凭证 * * 接收并存储由SSO服务端发来的凭证,凭证传输的方式有HTTPHeader、 Cookie和网址参数等。 * 提交凭证验证 * * 与SSO服务端通信,发出校验凭证有效性的请求 * 获取用户权限 * * 获取该凭证的用户权限,并返回受保护资源给用户 * 凭证销毁与登出 * * 销毁本地会话,然后跳转至登出页面。 ### 用户单点登录流程 ![8AB69889-1F82-43EE-B4CA-839661CBB211.png](http://yanxuan.nosdn.127.net/a83a3eb2e6b79259278415abd1707fa7.png) ### JWT Json Web Token(JwT)是目前应用最为广泛的 Token格式,是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC7519)。 该 Token被设计为紧凑且安全的,特别适用于分布式站点的单点登录、API网关等场景。 JWT的声明一般被用来在身份提供者和服务提供者之间传递被认证的用户身份信息,以便从资源服务器获取资源,也可以增加一些额外的其他业务逻辑所必需的声明信息。 该 Token可直接被用于认证,也可被加密。JWT信息体由3部分构成:头( Header)+载荷( Payload)+签名 1. JWT支持多种语言,C#、Java、 JavaScript、PHP等很多语言都可以使用。 2. JWT可以自身存储一些和业务逻辑有关的必要的非敏感信息,因为有了 Payload部分。 3. 利于传输,因为JWT的构成非常简单,字节占用很小。 4. 不需要在服务端保存会话信息,不仅省去服务端资源开销,而且易于应用的扩展