About SSO

前言:

SSO 是单点登录(Single sign-on )/单点登出(Single sign-off ) 的缩写。
SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。同理单点登出,即用户在一处登出,其他系统也相应登出。它是目前比较流行的企业业务整合的解决方案之一。

SSO与OpenIDOAuth的区分和联系:

OpenID 和 SSO的思想有相似之处,他们的宗旨就是用户使用统一的帐号,可以对不同的系统进行授权,也有一些较大的差别:
1、SSO是在一处登录,其他各处自动生效,在于集中管理;
2、OpenID是由用户自行决定是否允许其他第三方使用自己的帐号信息,在于去中心化,类似OAuth协议(其实目前国内开放平台的使用第三方帐号登录,就是使用OAuth协议模拟的伪OpenID),同时,OpenID是没有办法定义单点登出的(因为是去中心化的)。

已经有很多SSO的实现(包括开源的和商业的),不过都非常复杂,且依赖多,理解、部署、和现有系统集成都比较困难。

因此,在这里,从0开始,设计一套SSO的方案:

流程图:

名词解释:

1、Browser :客户端浏览器
2、Broker:siteA.com,siteB.com, etc…
3、SSO-Server:sso.com
4、token:broker和sso-server用来相互通信的凭证
5、token_cookie:broker种的cookie,是一个(随机数 + broker_name + SECRET)的加密值
6、session_cookie:sso-server种的cookie,可以理解为一个随机数
7、broker_name:每个broker都有一个标志identity
8、secret:每个broker都有一个secret,该secret只有该broker和sso-server知晓,用来加密(起到签名的作用)。
9、sign:对token_cookie, broker_name, nonce的签名
10、action: 为setup或者immediate, 默认为setup,表示如果用户在sso那里处于未登录状态,则跳转到login,immediate则意味着不跳到login页面,只是检查一下是否登录罢了。

流程说明:

用户第一次访问Broker :

1. 用户访问broker,由于是第一次访问,所以没有token_cookie,这时,Broker会生成一个随机数token,并将该token加密后,作为token_cookie种在浏览器中,然后将用户重定向到sso-server,请求sso-server把该token-cookie 和 用户的session绑定起来。

2. 用户访问sso-server,请求绑定token_cookie和用户session,传递的参数包括:上一步中生成的token, broker_name, nonce + 上述三者的签名 sign。

3. sso-server接到绑定请求后,首先验证签名,再检查cookie中是否有session_token,并且该session_token是否合法,如果合法,则把用户session和 md5( token_cookie + broker_name + SECRET )绑定起来,即通过后者可以查到该用户。反之,则重定向用户到sso/login页面,要求用户登录
这里会有action参数,默认为setup,如果没有登录,则引导用户跳转到sso/login页面

4. 用户访问sso/login 进行登录,提交的参数包括:token, broker_name, nonce + 上述三者的签名sign, username, password。sso-server对签名做验证,对用户名密码做验证,验证通过,则种一个session_cookie,并且按照上一步中的绑定策略,将用户session和 md5( token + broker_name + secret )绑定起来。之后,重定向用户到broker/index
用户访问broker/index,这时候,cookie中已经有token_cookie了,所以参考下面一节

用户再一次访问Broker :

用户访问broker,cookie中已经存在token_cookie,所以,broker会使用token_cookie 去sso-server那里,查找用户session:
1. 如果查到了,则返回用户信息
2. 如果没有查到,则重新生成一个token 和 相应的加密结果token_cookie,走“用户第一次访问Broker”流程

单点登出:

用户在任何一处登出时,都会把sso-server与该用户session绑定的token都删掉,来达到单点登出的目的。

发表评论