java - ForgeRock(用于 SSO)登录和注销的预期行为
问题描述
我的公司已使用 ForgeRock 实施 SSO。我们已经集成了两个应用程序(比如 app1 和 app2)登录,并且应用程序的数量将会增长。关于预期工作的查询:
登录行为:
- 用户登录app1并开始在其中做某事,
- 打开新选项卡/窗口点击 URL app2 url。
所以现在他应该直接进入 app2 的主页,而不是再次要求app2的登录凭据。对?但是对于这种情况,如何点击 app2 会将用户登录到app1的信息传递回 app2 ?是通过浏览器的 cookie 读取还是该系统/计算机的登录用户?如果是,我们如何读取登录用户,如果应用程序外部暴露给互联网用户怎么办?网民可以上网吗?在这种情况下,阅读登录用户可能没有意义,并且我们的一些应用程序暴露在互联网上。
注销行为:
如果用户完成了他在app1上的工作并单击了注销,但正在他在 app2 中的工作(例如,表单提交或任何多步骤活动)中将他从 app2 中注销,那么对他来说可能是不公平的放开他迄今为止所做的一切。但这就是预期的工作方式吗?
从一个应用程序中注销用户应该将他从与相同 SSO 集成的所有应用程序中注销吗?如果是这样,那就意味着不要在应用程序端使会话无效,还要向 SSO 服务器发送注销请求。但这也意味着所有应用程序都需要检查用户是否已注销的每个请求?我觉得这要求太高了。对于我的已登录用户应用程序的每个请求,我还需要检查他是否已退出 SSO?它应该如何工作?
解决方案
经过大量研究,我终于想通了:
登录行为:
对 !如果用户登录 app1,然后在同一浏览器的另一个选项卡/窗口(非私有模式)中点击 app2 的 url ,那么他应该已经登录 app2。app2 不需要单独登录。
app2 如何知道登录哪个用户?
这是通过与 SSO 集成的所有应用程序读取 cookie 来完成的。SSO 实施将在用户的浏览器窗口中为应用程序可用的特定域设置 cookie。此 cookie 将告诉应用程序哪个用户已登录。现在应用程序知道谁是经过身份验证的用户,并且应用程序可以执行其特定的操作,例如检查授权和其他常规操作。但是,如果用户使用不同的浏览器,比如 app1 chrome 和 app2 firefox,那么在这种情况下,无法为 app2 共享 cookie,用户必须再次通过身份验证过程。无论应用程序是否暴露在互联网上,此行为都将保持不变。
注销行为:
有不同的口味可供选择。没有硬性规定。如果您想从一个应用程序注销也应该意味着从所有其他应用程序注销,那么是的,它可以完成。一种方法是在所有请求中传递浏览器 cookie 中 SSO 实现设置的“令牌” 。如果在应用程序端收到有效令牌,则满足该请求,否则将他注销。
此外,如果您在一个应用程序已注销时其他应用程序正常工作,那么您不需要在每个请求中传递令牌,并且只能在应用程序级别进行注销。无需请求 SSO 进行注销。
推荐阅读
- javascript - JavaScript EventListener 未将事件变量传递给事件处理程序
- go - 在 Cloud Build 期间将存储库名称传递给 Slack 机器人
- python - QT QOpenGLWidget 大小错误
- python - 特定年份的熊猫数据框总和
- google-bigquery - Google Bigquery 中的事务管理
- oracle - 获取 ORA-00904:“DECL_OBJ#”:在 oracle 中使用 informatica 工具加载数据时标识符无效
- c++ - 我可以定义一个 constexpr 匿名/未命名变量吗?
- javascript - Node.js子进程挂起,需要调试思路
- node.js - Jest watch 未检测到文件更改
- r - 很难根据列值删除行