`
m635674608
  • 浏览: 4927051 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

关于web端的单点登录实践

 
阅读更多

问题:

 假设现在有4个域名,www.a.com,www.b.com,www.c.com,www.d.com,在a.com这个域内登录了,不种其他3个域名的cookie,如果用户输入其他的三个域的时候,也能保证用户在不输入用户名和密码的时候也能登录

说在前面的话:

1)在web端登录和未登录:使特定的cookie的值生效/失效,这个特定,就是你所制定的规则。

2)问题的关键:如何获得cookie的值,就获得了帐号的通行证,就可以登录了,然后就是做你想做的事情了。比如修改,删除资料,修改密码,做你想做的任何事情,总之,你控制了这个帐号了。

分析:

1)在www.a.com 这域名下登录,我们可以将cookie设置在a.com这顶级域名上,如果这个域的子域,比如1.a.com,2.a.com都能取到这个域的cookie的,都能登录,不存在不能登录

2)在a.com这个域名下登录了,如何在b.com,c.com,d.com这个域名下获得a.com的cookie的值,只要获得a.com这个域下的该用户的cookie的值就可以了。

如何取得cookie呢?我们做了以下思考:

1.跨域取cookie,这个是安全的吗?refer可以伪造吗,有那些方式?

2.跨域请求是否能获得header的内容?

3.跨域post提交(iframe+post)是否能获得iframe里面的内容?

现在我们看看上面3个问题:

1.跨域,我们这里思考,采用loadJsonp的形式,这个是安全的吗,loadjsonp对外都是静态的,我们可以看,别人也可以看,不同的是我电脑和浏览器的状态,基于这个考虑,我们限制了referrer,即来源,

这个可以挡住一部分,但是这个是可以伪造吗?查阅了相关资料,前端没有办法伪造,但是可以为空,在这个问题上,我们限制了referrer不为空,并且在我们的白名单里面就可以了。

2.是否能获得header的内容,我们知道loadJsonp是通过创建script标签来获取数据的,因此肯定不能获得header头信息的,ajax是可以的,只要设置 type: 'HEAD', 就可以获得头信息,但是ajax是不能跨域的,

因为我们排除了跨域获得header的可能性

3.由于安全沙箱的限制,iframe里面如果不是本域的内容,肯定不能获取得到。

基于以上考虑,我们就采取了loadjsonp+限制referrer的形式来跨域获得cookie,获取cookie后,我们就往本域的根目录写入,然后就可以在本域内实现登录。而不涉及到其他域的cookie问题。

方案实施:

方案1:提供通用js, 通过设置基准域名cookie(例如www.a.com), 其它业务均从基准域名获取cookie的方式,来获取登录状态。

登录时设置两个基准域和当前域下的cookie,其它业务需要时再拉取基准域名cookie来设置自身cookie。 

此方案存在的问题:

需要加载js,只能在页面加载完js到浏览器后才能执行,设置本域cookie, 需要再次刷新页面才能是登录状态。

业务方的页面有二种情况不能用这种方案:

1.登录后才能访问,一般会在后端判断用户是否未登录,然后直接跳转到登录页面,

2. 不登录也能访问,可是是否登录决定页面的部分显示数据(通用js自动登录后刷新本页面可以得到效果,但是用户体验差)。

此方案比较适合页面无需登录也能访问,并且登录后页面效果没有变化的页面,静态页面比较适合这种情况。

由于要检测当前域是否是登录状态,然后要请求基准域,并且设置本域cookie,对基准域本身的服务压力大,几乎是业务方的所有pv*n

方案2: 提供通用登录js, 每次需要用户输入用户名,密码之前,先去基准域名获取登录状态,如果是已经登录,就显示:已检测到已登录用户:XXX, 点击直接登录或者换其他账号登录,

此方案存在的问题:

不是通常意义的单点登录,只是缩短了用户登录的流程,减少代价

优点:

不用业务方每个页面都部署,对业务方完全透明;

对基准域的请求压力不大;

就算在目前轮询的事情下,也存在单域cookie失效导致用户未登录的情况,通过这种方式也能改善用户体验;

安全风险:

目前所有域下都是用的同一个cookie, 任何一个也没如果出现xss漏洞,都会导致用户cookie泄露,安全完全不可控, 单点登录会扩散这种风险。

参考文章:http://developer.51cto.com/art/201104/255729.htm

 

http://www.cnblogs.com/yupeng/archive/2012/08/27/2651397.html

分享到:
评论

相关推荐

    落雨博客基于CAS框架的单点登录技术讲解(ppt+code实例+doc)配套资料

    [置顶] SSO单点登录系列3:cas-server端配置认证方式实践(数据源+自定义java类认证) http://blog.csdn.net/ae6623/article/details/8851801 [置顶] SSO单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas...

    xmljava系统源码-simple-oauth2:一个简单oauth2应用服务,为第三方应用提供用户登录和授权

    2.0的四种通用授权方式,可以用于应用的统一单点登录、权限控制。 项目提供了相应的客户端、web filter、网关组件,实现应用的分布式和集中式权限控制,并给出各种场景下的使用样例,包括, 纯前端项目(jquery) ...

    asp.net知识库

    Server Side ViewState 在服务器端存贮ViewState (ASP.NET 2.0) VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP...

    ASP.NET4高级程序设计(第4版) 3/3

     《ASP.NET 4高级程序设计(第4版)》是ASP.NET领域的鸿篇巨制,全面讲解了ASP.NET4的各种特性及其背后的工作原理,并给出了许多针对如何构建复杂、可扩展的网站从实践中得出的建议。书中还深入讲述了其他ASP.NET图书...

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    ASP.NET 4高级程序设计(第4版)》【原版书为:Pro ASP.NET 4 in C# 2010】是ASP.NET领域的鸿篇巨制,全面讲解了ASP.NET4的各种特性及其背后的工作原理,并给出了许多针对如何构建复杂、可扩展的网站从实践中得出的...

    测试后端:测试点环境播放的后端

    在这个挑战中,您将设计和创建一个Web API来管理以下资源: Projects和Actions 。 指示 请仔细阅读这些说明。 在开始编写代码之前,请先确切地了解预期的内容。 这是一项个人评估,请单独进行。 这是一个机会来证明...

    Grails权威指南

     9.7 关于ajax性能的讨论  9.8 本章小结 第10章 服务(services)和作业(jobs)  10.1 服务基础知识  10.1.1 事务  10.1.2 服务和依赖注入  10.2 服务实战  10.2.1 示例a——扩展搜索...

    大数据分析及处理方法.docx

    采集 大数据的采集是指利用多个数据库来接收发自客户端(Web、App或者传感器形式等)的数据,并且用户可以通过这些数据库来进行简洁的查询和处理工作。比方,电商会使用传统的关系型数据库MySQL和Oracle等来存储每一...

    hibernate 框架详解

    目录 前言 1.... 2.... 1. 在Tomcat中快速上手 ... 1.1.... 1.2.... 1.3.... 1.4.... 1.5.... 2.1.... 2.2.... 2.2.1.... 2.2.2.... 2.2.3.... 2.2.4.... 2.2.5.... 2.2.6.... 2.3.... 2.3.1.... 单端关联代理(Single-ended association proxies) ...

    MySQLDBA运维笔记.pdf

    1.6.1 单实例 MySQL 登录的方法................................................................................22 1.6.2 多实例 MySQL 的登录方法..............................................................

    二十三种设计模式【PDF版】

    关于本站“设计模式” Java 提供了丰富的 API,同时又有强大的数据库系统作底层支持,那么我们的编程似乎变成了类似积木的简单"拼凑"和调用, 甚至有人提倡"蓝领程序员",这些都是对现代编程技术的不了解所至. 在...

    Hibernate中文详细学习文档

    19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using ...

    Hibernate+中文文档

    19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using ...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using ...

    Hibernate 中文 html 帮助文档

    19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using batch fetching) 19.1.6. 使用子查询抓取(Using ...

Global site tag (gtag.js) - Google Analytics