问题描述
我正在尝试使用SAML保护资源。有三个参与者在起作用:身份提供者(IdP,不在我的控制范围之内)、服务提供者(SP,我碰巧使用了Spring-Security-SAML,但这个问题并不特定于此),以及受保护的资源(PR,SP之外的服务中的某个受保护的端点)。
我需要支持两个场景:
用户首次尝试访问PR,没有任何类型的会话。 当用户以前访问过PR时,他们尝试再次访问PR。有很多关于场景1应该如何工作的指导,因为从我所看到的来看,这是使用SAML的标准方式。然而,场景2似乎不那么标准,我还没有找到任何关于如何处理它的权威文档。
在场景1中,流程似乎是标准的:
用户尝试访问请购单 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访问令牌),因此似乎没有任何方法来缓存用户的会话。推荐答案
访问PR可以有两种情况。
PR在需要续订之前指定时间创建的有效应用程序会话。 应用程序会话所基于的有效SAML令牌。 PR可以认为,只要SAML令牌有效,应用程序会话就有效。或者它可以决定每10分钟创建一个新会话,这意味着重定向到IdP以获取新的SAML令牌,新的应用程序会话基于该令牌。这取决于受保护的资源。在敏感资源中,可能是医疗数据,应该相应地管理会话。 在SAML令牌有效性方面,IdP使用Response/Conditions/NotBefore
和Response/Conditions/NotOnOrAfter
发布令牌一段设定的时间,如examples所示。还有Response/AuthnStatement/SessionNotOnOrAfter
可用于检查有效性。此:
获取或设置
由主题和SAML颁发机构标识的主体
此语句必须视为已结束
来自here。这实际上限制了公关会话,因为在此时间之后,IdP与用户断绝关系。例如,一小时访问PR的公共步行访问请求。NotOnOrAfter
指断言,SessionNotOnOrAfter
指用户。在SessionNotOnOrAfter
之后,IdP可能不会根据策略等对用户进行身份验证。
NotOnOrAfter
是否为过去。如果是,则SP将再次启动与IdP的进程以获得新的SAML令牌。如果IdP正在处理敏感的PR,它可能会在有限的时间内释放属性,具体取决于其结束时授予访问权限的方式。