V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Mrkon
V2EX  ›  程序员

使用 CAS 实现 SSO 的相关问题

  •  
  •   Mrkon · 2020-07-06 17:24:34 +08:00 · 2211 次点击
    这是一个创建于 1634 天前的主题,其中的信息可能已经有所发展或是发生改变。

    CAS 实现 SSO 至少有三个服务,分别是: 1.sso 站点 2.app1 站点 3.app2 站点

    我需要实现的是: 浏览器访问 app1 站点,在 app1 未登录的情况下重定向到 sso 站点.当 sso 站点也没有登录时,跳转回 app1 站点.

    我遇到的疑惑是: 当 sso 站点跳转回 app1 站点时,如何保证 app1 未登录的情况下不再跳转到 sso 站点.以免产生循环跳转.

    感谢大家的解答.

    15 条回复    2020-07-08 11:38:26 +08:00
    wangkai123
        1
    wangkai123  
       2020-07-06 17:32:32 +08:00
    1.“当 sso 站点也没有登录时,跳转回 app1 站点.” 这个需求有点奇怪

    2.当你已经实现了跳转回 app1 的逻辑,那可以写一个和第一次在浏览器访问 app1 不一样的 url 来避免循环跳转
    lslqtz
        2
    lslqtz  
       2020-07-06 17:50:32 +08:00
    看 referer 啊
    Mrkon
        3
    Mrkon  
    OP
       2020-07-06 17:50:45 +08:00
    @wangkai123 是可以选择不一样的 url 但是当 sso 站点又登录了,那么刷新 app1 就不会跳转到 sso 站点,也就不会登录了.

    关于需求,其实是需要在主页面(例如:http://www.baidu.com)就获取登录信息.像这些站点他们是怎么实现的单点登录呢?他们也没有跳转到登录页面啊?
    Mrkon
        4
    Mrkon  
    OP
       2020-07-06 17:56:12 +08:00
    @lslqtz referer 就是主页面,一般是 index.html 吧.但是跳转到这个页面又会根据用户未登录跳转到 sso 站点.
    lslqtz
        5
    lslqtz  
       2020-07-06 19:29:34 +08:00
    @Mrkon sso 跳回来的 ref 是 sso 的 ref,据此判断是否为重复跳转
    aegisho
        6
    aegisho  
       2020-07-06 20:09:04 +08:00
    app 站点的后端在 CAS 登录成功之后,需要存储对应的 session
    下次重新进入 app 站点时,是通过对应的后端 session 判断的。

    app -> app 后端 session 存在。
    app -> app 后端 session 不存在 -> 302 CAS 登录 -> 跳转 app,设置 session 。
    whileFalse
        7
    whileFalse  
       2020-07-06 20:58:07 +08:00
    app1 检查状态,发现是 {},于是跳转到 sso 。
    sso 把状态设置为 {"user": null},跳回 app1 。
    Mrkon
        8
    Mrkon  
    OP
       2020-07-07 11:15:22 +08:00
    @lslqtz 我使用的是 flask,不知道 ref 为什么一直是 None.所以根据思路直接设置在 cookies 里面了.
    Mrkon
        9
    Mrkon  
    OP
       2020-07-07 11:19:20 +08:00
    @whileFalse 这样的话,还是需要跳转 sso 检查状态吧?

    如果不检查,sso 登录了之后,app1 就不能获取登录状态了.
    Mrkon
        10
    Mrkon  
    OP
       2020-07-07 11:21:20 +08:00
    @aegisho 感谢回答,但是我的疑问是:
    app 后端 session 不存在 -> 不需要登录 -> 跳转回 app

    就像我们打开百度一样,未登录的时候,不会停留到在登录界面吧.
    whileFalse
        11
    whileFalse  
       2020-07-07 11:56:58 +08:00
    @Mrkon 可以搞定。sso 在用户登录时使用一个中间页面,该中间页面通过 iframe 或其他方式一口气把 app1 、app2 、app3 的登录状态全部写入,再跳回 app1 。
    aegisho
        12
    aegisho  
       2020-07-07 16:30:12 +08:00
    @Mrkon

    区分两个 session,app 的 session 和应用的 session

    更详细版本
    app -> app 后端 session 不存在 -> 302 CAS 服务 -> CAS 未登录输出登录页面 -> 用户登录 -> 跳转 app,设置 session 。

    app -> app 后端 session 不存在 -> 302 CAS 服务 -> CAS 已登录跳转 app,设置 session 。

    为什么你看不到登录页面,是因为在 app 跳转 cas 之后,cas 立刻跳转回了应用。
    你仔细看下 network 跳转过程,是可以发现有多次跳转的
    Mrkon
        13
    Mrkon  
    OP
       2020-07-08 09:33:40 +08:00
    @whileFalse 感谢,明白你的意思了.但是正是不做 iframe 才会这样,不然就可以直接通过 iframe 实现跨域了.
    Mrkon
        14
    Mrkon  
    OP
       2020-07-08 09:36:29 +08:00
    @aegisho 可能是我没有描述清楚
    在这个步骤中

    app -> app 后端 session 不存在 -> 302 CAS 服务 -> CAS 未登录输出登录页面 -> 用户登录 -> 跳转 app,设置 session

    我需要修改为

    app -> app 后端 session 不存在 -> 302 CAS 服务 -> CAS 未登录 -> 跳转回 app
    目前我通过设置 cookies 状态做到了
    whileFalse
        15
    whileFalse  
       2020-07-08 11:38:26 +08:00
    @Mrkon iframe 里面打开 app1 的“set session”页面啊。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2793 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 00:31 · PVG 08:31 · LAX 16:31 · JFK 19:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.