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”页面啊。
|