如何结合单点注销和无状态身份验证



我正在尝试添加一个基于SAML的单点登录/单点登录解决方案,以允许基于web的应用程序的混合生态系统,给最终用户留下他们正在与单个应用程序交互的印象。

标准方法似乎是让IdP管理用户身份验证(建立IdP会话),然后根据需要在每个组件应用程序中建立会话的请求上发出签名的SAML签名。

Sign Off可以通过使用SAML Single Sign Off来处理,在Sign Off时,IdP向每个服务提供者发出回传通道调用以使会话无效。

这对于传统的基于有状态会话的应用程序来说工作得很好,但是我正在尝试解决如何集成使用无状态JWT令牌代替服务器端会话的应用程序。

sign on部分的工作原理相同,我们只是发出一个JWT来响应SAML sign on,而不是建立一个传统的会话。通过简单地删除cookie,退出单个服务是可行的。

但是有没有办法实现单点签出流程呢?我能看到的唯一方法是:

  • 在同一域(或至少子域)上托管所有无状态应用程序
  • 在Sign-out时,删除该域的所有无状态认证cookie,而不仅仅是单个应用程序的cookie
  • 清除这些cookie后,触发SAML单点签出流来处理有状态的应用程序。

有更标准的方法吗?还是总是手工制作?

在我的研究中,我遇到了很多使用无状态令牌进行单点登录的情况,以及使用本地开发或SAML sign Off等标准的单点退出全状态应用程序的使用日志。但是我找不到比我描述的在混合环境中结合两者更简单或更标准的方法了。

引用:

  • 使用OAuth 2的单点登录-在滥用OAuth时,与我所描述的情况类似,但通过建立服务器端状态来验证OAuth令牌以实现签名来解决
  • 多个站点的透明用户会话(单点登录+单点注销)&如何实现无状态(无会话)& &;cookie-less认证吗?很好地描述了我渴望启用的那种无状态身份验证流,但似乎依赖于共享的服务器端令牌存储,或者仅仅依赖于超时而不是显式的退出

1 -身份提供者如何让目标应用程序知道它们不应该允许用户登录

在SAML中,这是通过在协议中形式化的单注销(SLO)实现的。IdP可以向目标应用程序发送SLO消息,然后目标应用程序可以采取行动。这把我们带到了

2 -目标应用程序如何在提供'有效' JWT令牌时阻止用户登录

当应用程序生成JWT令牌时,它需要这样做,以便以后可以撤销这个令牌。实际上,这意味着通过一些唯一标识符(如JWT ID (jti))跟踪发出的令牌。如果应用程序通过联系负责管理这些令牌的第三方来生成令牌,那么您希望/坚持第三方令牌发行者提供一种撤销令牌的方法。

如果应用程序(或第三方发行者)不能撤销令牌,那么你仍然可以通过令牌过期来实现这一点。这就是你可怜的人的令牌无效解决方案。

最新更新