单点登陆实现原理(SSO)
简介
- 单点登陆是在多个应用系统中,用户只须要登陆一次就能够访问全部相互信任的应用系统的保护资源,若用户在某个应用系统中进行注销登陆,全部的应用系统都不能再直接访问保护资源,像一些知名的大型网站,如:淘宝与天猫、新浪微博与新浪博客等都用到了这个技术。
原理
-
单点登陆html
- 有一个独立的认证中心,只有认证中心才能接受用户的用户名和密码等信息进行认证,其余系统不提供登陆入口,只接受认证中心的间接受权。间接受权经过令牌实现,当用户提供的用户名和密码经过认证中心认证后,认证中心会建立受权令牌,在接下来的跳转过程当中,受权令牌做为参数发送给各个子系统,子系统拿到令牌即获得了受权,而后建立局部会话。
- 示例:
下面对上图进行解释:-
当用户还没进行用户登陆的时候web
- 用户去访问系统1的保护资源 ,系统1检测到用户还没登陆,跳转至SSO认证中心,SSO认证中心也发现用户没有登陆,就跳转到用户至认证中心的登陆页面
- 用户在登陆页面提交用户相应信息后,认证中心会校验用户信息,若是用户信息正确的话认证中心就会建立与该用户的全局会话(全局会话过时的时候,用户就须要从新登陆了。全局会话中存的信息可能有令牌,用户信息,及该在各个系统的一些状况),同时建立受权令牌,而后进行下一步,不然认证中心给出提示(用户信息有误),待用户再次点击登陆的时候,再一次进行校验用户信息
- 认证中心带着令牌跳转到用户最初请求的地址(系统1),系统1拿到令牌后去SSO认证中心校验令牌是否有效,SSO认证中心校验令牌,若该令牌有效则进行下一步
- 注册系统1,而后系统1使用该令牌建立和用户的局部会话(若局部会话过时,跳转至SSO认证中心,SSO认证中心发现用户已经登陆,而后执行第3步),返回受保护资源
-
用户已经经过认证中心的认证后
用户访问系统2的保护资源,系统2发现用户未登陆,跳转至SSO认证中心,SSO认证中心发现用户已经登陆,就会带着令牌跳转回系统2,系统2拿到令牌后去SSO认证中心校验令牌是否有效,SSO认证中心返回有效,注册系统2,系统2使用该令牌建立与用户的局部会话,返回受保护资源。
api -
若是系统1的局部会话存在的话,当用户去访问系统1的保护资源时,就直接返回保护资源,不须要去认证中心验证了跨域
-
局部会话存在,全局会话必定存在;全局会话存在,局部会话不必定存在;全局会话销毁,局部会话必须销毁
若是在校验令牌过程当中发现客户端令牌和服务器端令牌不一致或者令牌过时的话,则用户以前的登陆就过时了,用户须要从新登陆
服务器关于令牌可参考:基于跨域单点登陆令牌的设计与实现restful
-
单点注销markdown
- 在一个子系统中注销,全局会话也会被注销,全部子系统的会话都会被注销
- 示例:
用户向系统1发出注销请求,系统1根据用户与系统1创建的会话id从会话中拿到令牌,向SSO认证中心发起注销请求,认证中心校验令牌有效,会销毁全局会话,同时取出此令牌注册的系统地址,认证中心向全部注册系统发出注销请求,各系统收到注销请求后销毁局部会话,认证中心引导用户跳转值登陆页面。
-
总体陈述post
- 单点登陆涉及SSO认证中心与多个子系统,子系统与SSO认证中心须要通讯(交换令牌、校验令牌及发起注销请求等),子系统中包含SSO的客户端,SSO认证中心是服务端
- 认证中心与客户端通讯可经过 httpClient、web service、rpc、restful api(url是其中一种) 等实现
- 客户端与服务器端的功能
- 客户端:
- 拦截子系统未登陆用户请求,跳转至sso认证中心
- 接收并存储sso认证中心发送的令牌
- 与服务器端通讯,校验令牌的有效性
- 创建局部会话
- 拦截用户注销请求,向sso认证中心发送注销请求
- 接收sso认证中心发出的注销请求,销毁局部会话
- 服务器端:
- 验证用户的登陆信息
- 建立全局会话
- 建立受权令牌
- 与客户端通讯发送令牌
- 校验客户端令牌有效性
- 系统注册
- 接收客户端注销请求,注销全部会话
- 客户端:
大体思路是:网站
访问业务系统时,由自定义的[Authorize]进行拦截url
获取到Token设置到请求头进行HttpPost到认证系统提供的/api/token/Authentication接口
响应给业务系统若是是成功则继续访问,若是是失败则401或者跳转到登陆页。
具体步骤:
- 认证中心登陆成功后,请求登陆中心接口得到token
- 携带token逐个跳转到业务系统的中转页面。
- 跳转完成后,返回到认证中心登陆页面进行引导。
另外可使用IdentityServer4实现单点登陆统一认证 做为认证中心
转载:http://www.cnblogs.com/zhuchenglin/p/8968530.html http://www.javashuo.com/article/p-sfwzivvf-kk.html