[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[备忘]Java,单点登录,CAS是支持跨域的~~

上一篇:[整理]ActiveMQ的简单使用方法
下一篇:[整理]Linux下安装VNCServer的方法

添加日期:2013/9/5 16:55:04 快速返回   返回列表 阅读6663次
官网:http://www.jasig.org/cas
可能要翻墙~~
----------------------------------

服务器都是IP,相当于跨域。
CAS是用cookie传递信息的,不行吧?

安全的sso方案中cookie中只有token而不会保存真实的信息。
-------------------------------------------------------------------
sso一般有两种实现,基于agent和proxy。 

CAS是基于agent的。一次完整的sso过程为 

1.用户第一次打开系统A的页面 
2.系统A发现当前用户没有登录 
3.系统将登录过程委托给本地的agent,比如CAS的java client或者web client 
4.本地agent将页面转向给sso系统,并且生成一个随机的token 
5.用户在sso系统上输入账号密码,登录成功 
6.sso系统调用系统A上agent的一个url,将账号信息加密发送回A 
7.该agent通过生成的token解密账号信息,传送到系统A内部。 
8.系统A接收到该账号随后进行授权操作。 

如果用户打开系统B页面,而该系统也运行同一个SSO的agent,那么过程同上面类似,只是跳过第5步。这时用户浏览器都是处于SSO系统所在域,所以可以直接将以前用户的账号信息发回。 


基于proxy的实现方案我只看到过novel iChain实现。这种方案需要通过DNS将多个系统的域名配置在一个承担SSO的Proxy上。当用户输入系统地址打开页面时,会首先链接到这个Proxy,再由Proxy转发到实际系统。原有系统因为用户没有登录,那么会返回登录页面,这时候iChain会截获这个登录页面,用自己的登录页面代替。用户在iChain提供的页面中输入用户名和密码,随后iChain根据LDAP(Novel的LDAP可以说是这行的老大了)中的信息查询出原有系统的用户名和密码,通过一次Http Post将用户账号发送给原有系统。 

如果用户打开新系统页面,那么基本不骤不变,只是iChain返回自己登录页面时,因为在同一个域中,可以发现该用户已经登录过,然后就直接Http Post到新系统而不出现登录页面。 

iChain的登录过程是从我参加的一个项目推测的,没有官方的技术文档,有哪位朋友熟悉请修正一下。 

其实SSO只是最简单的一个步骤,如何做好多系统之间的账号同步和授权才是大难题。
----------------------------------------------------------
CAS跨域的概念可能之前我在广州UserGroup的表达不周误导了一些网友,表示深深的抱歉,Yale CAS使用了Ticket Granting Cookie (简称TGC)去作为获取Service Ticket的凭据,稍微熟悉Kerberos的人都知道,Right? 

ok, 从Coder的角度,这个种TGC cookie是对用户身份的一种缓存,即当第2次被其他CAS Client重定向的时候,CAS Server实际上已经从用户的Cookie中抓取到TGC,然后知道TGC对应的用户,因此避免了一场ReInput password的灾难,如果CAS Server抓取不到TGC,则用户需要登陆。 

Simple, Right? 

你们说的不能跨域的意思是,当用户没法在abc.com和xyz.com之间做sso,对吗?因为abc.com和xyz.com不能识别对方的cookies?也就是abc.com/xyz.com不能共享cookie。 

如果是这样,CAS的sso似乎都在CAS Server端而非CAS Client端实现。 

CAS能够做abc.com和xyz.com的sso,因为所有的Client无需共享cookies,他们做很简的一件事情(你们自己都可以实现),重定向User到CAS Server,然后让CAS Server告诉CAS Client这个家伙究竟是谁。 

其实,跨域别人已经做过很多次了,或者参考下面的链接:) 
http://dev2dev.bea.com.cn/bbs/forum.jspa?forumID=29304&start=0
----------------------------------------------------------------
靠,茅塞顿开~~A系统登录成功后,访问B系统,B系统什么都不管,转向到Server,Server知道当前用户是谁(因为用户访问过Server),然后告诉B系统。
--------------------------------------------------------------
我最近很仔细的深入了一下CAS,还给他们报了个bug,被接受了. 
所以我想我有资格来解释一下CAS的东西吧. 
CAS用来标志用户的token是存在它自己的域名下的,不是存在web应用的域名下的.CAS判断用户登录由agent决定,agent验证用户信息有两种处理. 
1.如果这个用户是以前没登录过的,也就是说这个web应用的域名下没有一个agent颁发的sessionid(在cookie里)的话,那么它会跳转到CAS server的登录界面(这里由CAS server决定是否显示登录界面,还是直接就跳转回来,也就是不是每次都要求输入密码登录的). 
2.CAS的登录界面会有两种处理.如果以前没登录过,也就是在CAS server自己的域名下,没有用户的token的话,就要求登录.如果有token的话,就返回一个ticket(也就是不显示登录界面直接重定向返回了). 
然后接第一步里面,agent收到ticket以后就提交给CAS server验证,并取得返回信息(是个xml,cas的协议规定的,也可以用saml之类的,这个地方可以取得除了用户姓名以外的信息,这样就可以做同步了,权限的问题可以这么解决).然后agent就保存此时的session,把sessionid放到该web应用域名下的cookie里. 
以上逻辑说明了,标志用户身份的token在CAS server的域名下,每个web应用不保存用户身份.因此跨域是绝对没问题的.只是single sign off就需要CAS server的配合了,要把那个token删掉. 
不过如果标志身份的token不存在,而sessionid存在,那还是被认为是登录的,只不过是在等待那个session timeout而已. 

如果我的理解有误,希望大家指正.
----------------------------------------------------------------
 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved