cookie单点登录

新近一家公司上来就让做oa,要求嵌入公司现有系统模块,自然而然想到模拟post单点登录对方系统新建单点登陆页面保存session,然现有系统都有用cookie保存用户信息,故保存本地cookie……测试失败。网上查询得知,生成的cookie所在的domainName不同所致,也就是存在cookie跨域访问问题。

因为现有相同都是ip+端口访问方式,故无法使用二级域名共享cookie,现想到方法就是利用iframe来实现SSO,解决方法如下:

主系统通过js创建隐藏iframe(src路径即为子系统所建ashx页面)

 //创建隐藏iframe调用单点登录页面实现cookie跨域共享
 var sso_frm = document.createElement("iframe");
 sso_frm.style.display = "none";
 sso_frm.src = "@ViewBag.SSO_Url?uid=@ViewBag.uid&pwd=@ViewBag.pwd";
 document.body.appendChild(sso_frm);

子系统新建一个ashx页面,接收参数并写入cookie (代码略),这个方法取了个巧,相当于变相的登录了其他系统,唯一不足之处就是在主平台登录时需要遍历所有权限内子系统创建iframe并登录,这个方法可以很好地处理不同主域下的单点登录。

扩展

1)对于相同主域下的二级域名我们可以利用二级域名共享cookie实现单点登录如:站点A登录后创建cookie,设置主域:cookie.Domain = "sso.com",此时B登录可直接获取A创建的cookie。

2)对于不同主域下的单点登录除了利用iframe还可以借助统一认证站点(passport.com)来实现单点登录

例如”

站点A   www.a.com

站点B   www.b.com

认证站点C   www.passport.com

票据:ticket加密的账号密码以cookie形式存在。

认证过程:假设用户user1未曾登录过站点AB,  A登录后判断 a_ticket(user1加密账号密码)是否存在,否则跳转站点C验证页面,登录成功后生成c_ticket(加密账号密码)并返回A站a_ticket;而后B站点登录会重定向站点C 验证c_ticket验证成功返回b_ticket并重定向B。

3) 我们也可以利用redis来替换认证站点C 处理逻辑与上述过程类似:

1.user1访问站点A,如果a_ticket存在则正常登录,否则判断缓存中是否存在以user1账号为key的值(user1账号密码加密),如果存在即返回该值并写入a_ticket,如果不存在即跳转站点A登录页登录后创建user1的redis缓存并创建a_ticket;

2.user1访问站点B,如果b_ticket存在则正常登录,否则判断缓存中是否存在以user1账号为key的值(user1账号密码加密),如果存在即返回该值并写入b_ticket,如果不存在则挑战站点B登录页面登录后创建

user1的redis缓存并创建b_ticket;

 

总结:写的有点碎,但是大体意思应该表达清楚了,实现起来也比较简单就不再赘述。

 

posted @ 2016-07-18 16:58  sean-日积月累  阅读(2701)  评论(0编辑  收藏  举报