我正在尝试使用 SAML 保护资源。有三个参与者在起作用:身份提供者(IDP,我无法控制)、服务提供者(SP,我碰巧使用的是 spring-security-saml,但这个问题并不特定于此)和受保护资源(PR ,SP 之外的服务中的一些受保护端点)。
我需要支持两种情况:
- 用户第一次尝试访问 PR,没有任何类型的会话。
- 用户在之前访问过 PR 时尝试再次访问它。
关于方案 1 的工作方式有充分的指导,因为它是我所看到的使用 SAML 的标准方法。不过,场景 2 似乎不太标准,我还没有找到任何关于如何处理它的明确文档。
在场景 1 中,流程似乎是标准的:
- 用户尝试访问 PR
- PR 将用户引导至 SP
- SP 对 IDP 执行正常的 SAML 断言,然后将用户重定向到使用 IDP 登录
- 用户成功登录 IDP
- 用户被重定向回 SP 并提供有关用户的信息
- SP 重定向回 PR(可能带有某种生成的令牌以供将来使用或有关用户的其他信息)
- 来自 PR 的信息提供给用户
这是我不太清楚的情况2,我的想法如下:
- 用户尝试使用之前场景中提供的令牌访问 PR
- PR 用 SP 检查令牌的有效性
- SP 确定令牌是否有效(这是如何完成的?SAML 标准中似乎没有任何内容可用于检查会话是否处于活动状态)
- PR 允许根据 SP 的响应访问资源
我的问题是:
- 我对场景 2 的理解正确吗?这就是 SAML 的用途吗?
- 我将如何检查与 IDP 的会话的有效性?
- PR 是否必须在每个请求上检查会话的有效性?由于 SAML 不需要过期(如 OAuth 访问令牌),因此似乎没有任何方法可以缓存用户的会话。