
CAS 实现 SSO 至少有三个服务,分别是: 1.sso 站点 2.app1 站点 3.app2 站点
我需要实现的是: 浏览器访问 app1 站点,在 app1 未登录的情况下重定向到 sso 站点.当 sso 站点也没有登录时,跳转回 app1 站点.
我遇到的疑惑是: 当 sso 站点跳转回 app1 站点时,如何保证 app1 未登录的情况下不再跳转到 sso 站点.以免产生循环跳转.
感谢大家的解答.
1 wangkai123 2020-07-06 17:32:32 +08:00 1.“当 sso 站点也没有登录时,跳转回 app1 站点.” 这个需求有点奇怪 2.当你已经实现了跳转回 app1 的逻辑,那可以写一个和第一次在浏览器访问 app1 不一样的 url 来避免循环跳转 |
2 lslqtz 2020-07-06 17:50:32 +08:00 看 referer 啊 |
3 Mrkon OP @wangkai123 是可以选择不一样的 url 但是当 sso 站点又登录了,那么刷新 app1 就不会跳转到 sso 站点,也就不会登录了. 关于需求,其实是需要在主页面(例如:http://www.baidu.com)就获取登录信息.像这些站点他们是怎么实现的单点登录呢?他们也没有跳转到登录页面啊? |
4 Mrkon OP @lslqtz referer 就是主页面,一般是 index.html 吧.但是跳转到这个页面又会根据用户未登录跳转到 sso 站点. |
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 。 |
7 whileFalse 2020-07-06 20:58:07 +08:00 app1 检查状态,发现是 {},于是跳转到 sso 。 sso 把状态设置为 {"user": null},跳回 app1 。 |
8 Mrkon OP @lslqtz 我使用的是 flask,不知道 ref 为什么一直是 None.所以根据思路直接设置在 cookies 里面了. |
9 Mrkon OP |
10 Mrkon OP |
11 whileFalse 2020-07-07 11:56:58 +08:00 @Mrkon 可以搞定。sso 在用户登录时使用一个中间页面,该中间页面通过 iframe 或其他方式一口气把 app1 、app2 、app3 的登录状态全部写入,再跳回 app1 。 |
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 跳转过程,是可以发现有多次跳转的 |
13 Mrkon OP @whileFalse 感谢,明白你的意思了.但是正是不做 iframe 才会这样,不然就可以直接通过 iframe 实现跨域了. |
14 Mrkon OP @aegisho 可能是我没有描述清楚 在这个步骤中 app -> app 后端 session 不存在 -> 302 CAS 服务 -> CAS 未登录输出登录页面 -> 用户登录 -> 跳转 app,设置 session 我需要修改为 app -> app 后端 session 不存在 -> 302 CAS 服务 -> CAS 未登录 -> 跳转回 app 目前我通过设置 cookies 状态做到了 |
15 whileFalse 2020-07-08 11:38:26 +08:00 @Mrkon iframe 里面打开 app1 的“set session”页面啊。 |