0

我正在尝试使用 SAML 保护资源。有三个参与者在起作用:身份提供者(IDP,我无法控制)、服务提供者(SP,我碰巧使用的是 spring-security-saml,但这个问题并不特定于此)和受保护资源(PR ,SP 之外的服务中的一些受保护端点)。

我需要支持两种情况:

  1. 用户第一次尝试访问 PR,没有任何类型的会话。
  2. 用户在之前访问过 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 访问令牌),因此似乎没有任何方法可以缓存用户的会话。
4

1 回答 1

2

访问 PR 可以有两个条件。

  1. PR 创建的有效应用程序会话,在需要更新之前具有指定时间。
  2. 应用程序会话所基于的有效 SAML 令牌。

PR 可以认为只要 SAML 令牌有效,那么应用程序会话就有效。或者它可以决定每 10 分钟创建一个新会话,这意味着重定向到 IdP 以获取新的 SAML 令牌,新的应用程序会话基于该令牌。这取决于受保护的资源。在敏感资源(可能是医疗数据)中,应相应地管理会话。

Response/Conditions/NotBefore就 SAML 令牌有效性而言, IdP 使用示例Response/Conditions/NotOnOrAfter在设定的时间段内发布令牌。还有可以用来检查有效性的。这个:Response/AuthnStatement/SessionNotOnOrAfter

获取或设置主体标识的主体与发出此语句的 SAML 机构之间的会话必须被视为结束的时间点

这里。这有效地限制了 PR 会话,因为 IdP 在此时间之后“拒绝”用户。例如,一个小时访问 PR 的公开访问请求。NotOnOrAfter指的是断言,而SessionNotOnOrAfter指的是用户。之后SessionNotOnOrAfterIdP 可能不会根据策略等对用户进行身份验证。

如果 PR 需要更新应用程序会话,它可以要求 SP 验证 SAML 令牌,这可能涉及确定是否NotOnOrAfter过去。如果是,则 SP 将再次使用 IdP 启动该过程以获取新的 SAML 令牌。如果 IdP 正在处理敏感 PR,它可能会在有限的时间内释放属性,具体取决于最终授予访问权限的方式。

于 2020-11-03T10:48:12.143 回答