• 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;

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

    学无先后,达者为师
  • 相关阅读:
    基于Metaweblog API 接口一键发布到国内外主流博客平台
    uva144 Student Grants
    Uva 10452
    Uva 439 Knight Moves
    Uva 352 The Seasonal War
    switch语句
    java——基础知识
    我的lua学习2
    codeforces 431 D. Random Task 组合数学
    codeforces 285 D. Permutation Sum 状压 dfs打表
  • 原文地址:https://www.cnblogs.com/seanchang/p/5681915.html
Copyright © 2020-2023  润新知