单点登录

来源:互联网 发布:java项目 编辑:程序博客网 时间:2024/04/27 14:40

近来搞了一下单点登录。

我们弄的单点登录估计是最简单的。

【概要原理】:

假设有2个应用站点A和B,都需要登录才可以访问,另外有一个专门负责登录的站点SSO。

现在有个用户访问站点A,站点A会先检查该用户是否已经登录,如果已经登录,则返回相应页面;否则转向SSO进行登录,登录成功后,转回站点A,返回请求的相应页面。

接着,该用户又访问站点B。同样,站点B会先检查该用户是否已经登录。这时候发觉是已经登录,于是直接返回请求的相应页面。

这就是单点登录,一次登录,处处通行。

【细节原理】

如何知道用户是否登录?

在SSO登录的时候,会将登录信息记入SSO的COOKIE;返回应用站点A或B时,同时将登录信息记入A或B的COOKIE。因此,登录信息在SSO和应用站点各有一份。

当有用户请求页面的时候,应用站点先检查自身的COOKIE,有的话,就表示已经登录,没有才转向SSO进行登录。

转到SSO的时候,SSO也先检查自己的COOKIE,看是否已经登录,有的话则自动转回应用站点,告诉应用站点该用户已经登录;如果没有COOKIE,才出现登录界面,让用户进行登录。因此,无论哪个应用站点先登录,SSO都有COOKIE,从而实现单点登录。

SSO上的COOKIE应该是永久性COOKIE或者时间比较长的COOKIE,例如2周,1个月,等等;而应用站点的COOKIE是临时性COOKIE,浏览器关掉就会消失那种。

【登出】

步骤是先清除应用站点的登录COOKIE,然后转到SSO清除SSO的COOKIE。

由此可知,单点登录不等于单点登出,站点A登出以后,站点A和SSO的COOKIE都被清除,但站点B的COOKIE还在,它并不知道已经登出了,除非浏览器被关掉,否则它还可以正常运行。

看起来这是一个BUG。不过,对安全性要求不高的情况下,并不会出现很大的问题。

 

后记

其实,要实现单点登出也不难,就是所有应用单点登录的站点,其COOKIE的Domain都指向一级域名(注意,www.abc.com是二级,abc.com才是一级)。如下:

              cookie.Secure = false;
                    cookie.Domain = ".abc.com";

这样,某个子站点登出以后,修改了这个cookie;而其他子站点也是读这个COOKIE,当然知道已经登出了。

原创粉丝点击