SAML SP与IDP会话超时不一致的处理方式及测试问题问询
这个场景在SAML单点登录里挺常见的——当SP的会话超时规则比IDP严格时,就会出现SP要求重认证但IDP还认老会话的尴尬窗口。针对你用SSOCircle IDP的情况,这里有几个实用的解决方案:
强制IDP重认证(最直接的方案)
当SP检测到自身会话超时后,发起SAML认证请求时,一定要设置ForceAuthn="true"参数。这个参数的作用就是告诉IDP:不管用户在你那边有没有有效会话,都必须让用户重新输入凭证。这样就能完全对齐SP的2小时超时要求,彻底消除那个矛盾窗口。
在你的SP代码里,生成AuthnRequest的时候,找到对应配置项开启这个参数就行——比如用常见的SAML开发库,一般都会有类似force_authentication: true的配置字段。基于IDP返回的会话超时信息同步SP超时
很多IDP会在SAML响应的AuthnStatement节点里返回SessionNotOnOrAfter属性,这个值就是IDP会话的过期时间。如果SSOCircle支持返回这个属性,你可以在SP端拿到这个时间后,把SP的会话超时设置成和它一致(或者比它短个3-5分钟,留个缓冲)。这样两边的会话超时就同步了,不会出现SP先过期的情况。
你可以先抓包看看SSOCircle的SAML响应里有没有这个字段,如果有的话,这是最优雅的协同方式。SP会话超时后主动触发IDP注销(需IDP支持)
如果SSOCircle支持SAML单注销(SLO)协议,那你可以在SP检测到会话超时的时候,主动向IDP发起注销请求,把IDP端的用户会话也销毁掉。这样用户下次访问SP时,IDP也会要求重新认证,自然就不会有冲突了。
不过要注意,这个方案需要你的SP实现SLO的逻辑,同时SSOCircle要支持接收SLO请求——你可以先查一下SSOCircle的文档确认这点。给用户明确的重认证提示(降级方案)
如果上面的方案都因为IDP的限制没法实现,那可以退而求其次:当SP会话超时后,先给用户显示一个明确的提示,比如“你的登录会话已过期,请点击下方按钮重新登录”,然后在用户点击按钮时,再发起带ForceAuthn="true"的认证请求。这样既保证了SP的超时规则,也不会让用户觉得莫名其妙。
内容的提问来源于stack exchange,提问作者AlbeyAmakiir

