跨域单点登录解决方案

单点登录有两种模型,一种是共同父域下的单点登录(例如域名都是 xx.a.com),还有就是完全跨域下的单点登录(例如域名是xx.a.com,xx.b.com),本文我们讲一下完全跨域下的单点登录该怎么实现。


基于安全考虑,想通过cookie来实现这个功能是不太可能的了(也许有其他黑科技可以实现,这里不做讨论)。这里介绍的方案是参考shiro框架的跨域session共享方案来实现的。我们知道浏览器访问系统的时候会生成一个session,那么每次请求如何知道是来自同一个浏览器呢?是因为浏览器为每个域存储了一个可以称作为session的cookie的东西,每次请求该域都会把对应的这个cookie带上,然后服务器根据这个cookie值去查找对应的session。

想要达到完全跨域的单点登录要满足两个条件:

首先要让session可以被所有系统都访问到。

其次要让同一个浏览器下的想要实现跨域的所有系统都使用同一个session。


第一个条件通过使用spring-session框架把session存储在redis中,可以很容易实现。

那么第二个条件如何实现呢?答案就是想方法为每个域设置相同的session的cookie 。


举个例子,比如有a、b两个站点域名分别是www.a.com,www.b.com,这两个域名需要共享session,并且已b域名下的session为主,a登录时跳转到b域进行登录,成功登录之后重定向到a时把sessionid带上,a站点拿到sessionid之后回写到浏览器覆盖原来生成的session的cookie。这时再次访问a站点用的就是同一个session了。大概画一个图如下:


上述方案可以实现完全跨域下的单点登录,但是存在一个很大的问题,就是安全问题!

假如在第④步操作重定向回a站点时,请求链接被不法分子拦截到了,他拿着这个链接就可以直接访问a站点了。


安全问题解决方案如下图:


其实⑥、⑦两步主要要解决的问题是,向b(认证服务器)证明:“我请求认证我是合法请求,我不是非法请求”。认证成功后,返回sessionId。

猜你喜欢

转载自blog.csdn.net/universsky2015/article/details/108994015
今日推荐