内网多产品单点登录一般用的是什么方案?

2022-09-13 13:57:11 +08:00
 edis0n0
例如在 auth.mycompany.work 登录后 gitlab.mycompany.work nextcloud.mycompany.work oa.mycompany.work 全都自动登录了,只要在一个服务登出全部的服务都登出了,一般用的是什么方案?

auth.mycompany.work 下没有找到版权信息。
5303 次点击
所在节点    程序员
34 条回复
0703wzq
2022-09-13 14:04:10 +08:00
我自己设计了一套,目前是采用 oAuth2.0 ,至于同步退出走的消息通知,一个应用退出会通知其他已登录应用同步退出销毁登录态。用 oAuth2.0 可以满足不同域名下的登录,缺点是用户数据同步这块都要额外做逻辑。也可以走传统的直接同域共享 cookie 的方案。
dudubaba
2022-09-13 14:09:41 +08:00
jwt 呗存缓存,子域名共享 cookie
xiang0818
2022-09-13 14:10:03 +08:00
内网用最简单的 cookie 同域共享就好了
edis0n0
2022-09-13 14:12:44 +08:00
@dudubaba #2
@xiang0818 #3

nextcloud gitlab 这些都不是我们公司的产品,共享 cookie 是不是要用什么插件?(直接改代码不太可能吧,后续更新之类的都不方便)

看起来像是 #1 提到的 oauth
edis0n0
2022-09-13 14:21:49 +08:00
访问 nextcloud.mycompany.work 会跳转到 https://auth.mycompany.work/Auth?returnUrl=https://nextcloud.mycompany.work 如果 auth 这边有登录状态会在 returnUrl 后面附上 token 跳转回去完成登录。单点登出是直接跳转到 https://auth.mycompany.work/Signout?t=202209130900 ,没有设置 cookies 操作就全局登出了,没看懂怎么实现的。
mosakashaka
2022-09-13 14:25:39 +08:00
单点退出有一种方案是各个系统提供一个回调,单点后台调用,cas 就是
moliliang
2022-09-13 14:50:09 +08:00
企业微信 应用之类就好啦~
nothingistrue
2022-09-13 14:57:24 +08:00
@edis0n0 #5 这个就是 OAuth2 或者类似的过程。

这里面有两次重定向。

第一次重定向,访问 nextcloud.mycompany.work 发现没有登录,它给你重定向到 auth.mycompany.work 。重定向之后的过程就是本地浏览器根 auth.mycompany.work 的通信过程了,如果是标准的 OAuth2 , 每个来源网站的首次登录都会蹦出一个界面让用户同意授权,这里大概率会略去或者隐藏这个过程。

第二次重定向,当浏览器跟 auth.mycompany.work 完成认证授权过程之后,auth.mycompany.work 指示浏览器重定向回之前的 nextcloud.mycompany.work ,并附上 token 。然后,nextcloud.mycompany.work 再指示浏览器通过 LocalStorage 或者 Cookie 保存令牌。令牌保存之后,后面的过程就跟常规的令牌认证过程没区别了。

如果是标准的 OAuth2 且不使用简单模式,在两次重定向之间,会有一个授权代码换访问令牌的过程,不过单点登录过程可以不要这个步骤。



一退全退这个,光凭 OAuth2 就办不到了,上面有人说的“一个应用退出会通知其他已登录应用”的方案也不可行,因为令牌认证模式不是会话认证模式,服务器没法单方面登出。服务器需要借助一些其他手段,能够让令牌集中失效才行。
varrily
2022-09-13 15:02:15 +08:00
XhstormR02
2022-09-13 15:04:16 +08:00
keycloak
nothingistrue
2022-09-13 15:07:23 +08:00
我能想到的一个方案是,给令牌设计一个特定的字段,比如授权时间。服务器通过 Redis 等缓存,设计一份全服务可用的“用户 ID—允许的最早授权时间”的键值对数据。 鉴权服务器( auth.mycompany.work )每次令牌发放,都以当前时间设置令牌的授权时间。 业务服务器( nextcloud.mycompany.work ),每次令牌验证,额外验证令牌的授权时间是否大于缓存中获取的“允许的最早授权时间”。任意一个服务登出时,以当前时间更新缓存中的“允许的最早授权时间”。
akira
2022-09-13 15:10:16 +08:00
首先你要有个账号中心吧。然后就是看你用到的各家产品都支持啥认证了
0703wzq
2022-09-13 15:20:21 +08:00
@nothingistrue 我这边设计了 2 种形式:
1:被动式,应用提供一个接口等待被调用用于销毁登录态(支持 2 种方式 api 或后台进程监听通知事件)
2:主动式,应用会定期请求登录门户 api ,检查当前令牌是否失效,这个时间我目前设置为 2 分钟。

基于这两种方式,实现某一应用退出,由登录门户通知其他应用,如这个通知失败有尝试机制,如再失败则有主动式最迟 2 分钟的保底使应用退出。
jackma0571
2022-09-13 15:32:30 +08:00
SSO?
Kontinue
2022-09-13 15:37:13 +08:00
ldap?
tinybaby365
2022-09-13 15:44:10 +08:00
先用 ldap server ,apache ds 这类的软件建一个最核心的账号中心。
一部分软件可以直接使用 ldap 集成登录,如:gitlab ,jenkins ,svn 等。
然后你围绕这个核心的账号中心,开发搭建其他协议的接入登录系统,如:oauth ,saml 等。

也可以不遵循任何标准。如可以用 jwt 方案,通过浏览器 post 给业务系统登录(生成 jwt 的站点放在内网,外网业务系统不直接连接账号中心)

不建议 jwt 放在共享的 cookie 里面(虽然方便,但安全系统降低了)

要提升 jwt 的安全性:各个业务系统不能共享密钥,有时间限制(有效时间不能太长,明确的时间范围),有额外的吊销机制。
novolunt
2022-09-13 15:51:14 +08:00
一样 ldap
skies457
2022-09-13 16:12:23 +08:00
可以直接用 gitlab 来 oauth2 验证
BQsummer
2022-09-13 17:20:06 +08:00
keyclock
linshuizhaoying
2022-09-13 17:23:57 +08:00
基本都 oauth 目前做法后端实现逻辑 前端这边有需要 sso 展示的做法都是直接做 iframe 加载 因为很多产品以后是别的公司的

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

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

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

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

© 2021 V2EX