单点登录SSO
需求引入:
最近在开发一个新系统,但是最后用户提出需求,新系统需要在他们原来的旧系统里面登录,再链接到新系统里面,但是两套系统的开发方式完全不同,最后考虑用单点登录实现。
实际实现过程发现了一些问题:Cookie无法跨域 Ajax 无法跨域
原来的实现方式:在旧系统登录的时候,往新系统添加人员信息,当页面链接到新系统页面时,请求旧系统当前登录人员信息(请求当前人员的Cookie数据),但是两个系统的域名不同。旧系统(www.A.com) 新系统(www.B.com) 访问B系统的时候 跨域请求A系统的Cookie数据,考虑当前系统基于公司内网,所以安全性要求没很高,就采用这种实现方式。 B采用Jsonp 跨域访问 A系统的Hanler请求。 在Google、FireFox测试通过。但是IE却访问不到Cookie信息。上网查了一下 p3p协议
浏览器的第三方 cookie 限制
所谓第三方 cookie,就是说你访问网页 A,却接收到域名 B 的 cookie 设定指令。这可能是由于网页 A 请求或链接了 B 的网页,比如上面提到的 iframe 以及 jsonp。
我查到了各个浏览器对于跨域的处理规则,可以看到第三方 cookie ,IE 在默认设置中是做了限制的。
IE | FIREFOX | CHROME | SAFARI | OPERA | |
---|---|---|---|---|---|
限制第三方coookie | 是 | 否 | 否 | 是 | 否 |
解决方案:
要解决这个问题,有 2 种方法,调整 IE 设置(工具-IE选项-隐私-高级-替换自动Cookie处理),将第三方域名加入到可信网站列表中;另一个方法,就是 P3P 了。
但是第一种方式,让用户去设置这么麻烦的东西,还是不靠谱的。
实现第二种方式,在Handler请求返还数据Http头部加上 p3p
HttpContext.Current.Response.AddHeader("p3p", "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");
p3p:
P3P 全称 Platform for Privacy Preferences,隐私设定平台规范。
完整地部署 P3P 包括设立隐私政策文件(policy.html)、原则档(policy.xml)、参考档(p3p.xml),有兴趣详细了解的可以参考 MSDN 中关于部署 P3P 的文章。
除了传送 P3P http header,还可以通过 HTML meta 标签,或者 设定 IIS 服务器 来声明 P3P。
参考链接:http://blog.darkthread.net/post-2011-10-27-p3p-header-and-iframe-session.aspx
上面的实现方式其实还是不是很满意的一种方式,但是限于时间紧急,只有采用最快的实现方式,不需要改动太多。关于网上介绍的SSO登录方法很多。自己花了点时间做了一些总结:
SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。
实现机制:
当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据--ticket;用户再访问别的应用的时候就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行校验,检查ticket的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。
实际上:在实现的过程中,在访问应用系统1的时候会跳到认证系统登录,除了登录之外,还需要有两次访问认证系统,第一次获取令牌(Cookie),第二次才是获取凭证,凭证一般会有时间限制,一般是需要存在数据库表里面 (GUID 、有效时间、人员信息(userid)),跟上面百度查的有点出入。