使用 CAS 实现 SSO 的相关问题

2020-07-06 17:24:34 +08:00
 Mrkon

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

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

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

感谢大家的解答.

2190 次点击
所在节点    程序员
15 条回复
wangkai123
2020-07-06 17:32:32 +08:00
1.“当 sso 站点也没有登录时,跳转回 app1 站点.” 这个需求有点奇怪

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

关于需求,其实是需要在主页面(例如:http://www.baidu.com)就获取登录信息.像这些站点他们是怎么实现的单点登录呢?他们也没有跳转到登录页面啊?
Mrkon
2020-07-06 17:56:12 +08:00
@lslqtz referer 就是主页面,一般是 index.html 吧.但是跳转到这个页面又会根据用户未登录跳转到 sso 站点.
lslqtz
2020-07-06 19:29:34 +08:00
@Mrkon sso 跳回来的 ref 是 sso 的 ref,据此判断是否为重复跳转
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
2020-07-06 20:58:07 +08:00
app1 检查状态,发现是 {},于是跳转到 sso 。
sso 把状态设置为 {"user": null},跳回 app1 。
Mrkon
2020-07-07 11:15:22 +08:00
@lslqtz 我使用的是 flask,不知道 ref 为什么一直是 None.所以根据思路直接设置在 cookies 里面了.
Mrkon
2020-07-07 11:19:20 +08:00
@whileFalse 这样的话,还是需要跳转 sso 检查状态吧?

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

就像我们打开百度一样,未登录的时候,不会停留到在登录界面吧.
whileFalse
2020-07-07 11:56:58 +08:00
@Mrkon 可以搞定。sso 在用户登录时使用一个中间页面,该中间页面通过 iframe 或其他方式一口气把 app1 、app2 、app3 的登录状态全部写入,再跳回 app1 。
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
2020-07-08 09:33:40 +08:00
@whileFalse 感谢,明白你的意思了.但是正是不做 iframe 才会这样,不然就可以直接通过 iframe 实现跨域了.
Mrkon
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
2020-07-08 11:38:26 +08:00
@Mrkon iframe 里面打开 app1 的“set session”页面啊。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/687633

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX