Lip*_*ier 5 state oauth session-cookies single-sign-on browser-tab
当新的浏览器会话启动时,多个选项卡试图同时打开“安全服务器”(我们的 Oauth2 机密客户端)上的多个链接,OAuth2 身份验证代码流中基于 cookie 的会话和状态参数处理的性质会暴露出一个问题。
当浏览器启动时,它会丢弃所有以前的会话 cookie。在崩溃恢复的情况下,浏览器可以一次打开多个选项卡,或者用户可以从书签文件夹或历史记录中一次打开多个选项卡。
在这种情况下,所有选项卡将同时向 Secure Server 发送未经身份验证的请求。每个请求将启动一个新会话和一个新的身份验证代码流,以及新的状态参数,这些参数将保存在此会话中。
所有 Secure Server 的重定向到身份提供商的响应都将带有一个名称相同但值不同的会话 cookie。它们在浏览器中会互相覆盖,浏览器只保留最后一个作为Session ID。
每个选项卡将继续沿着授权代码流程到达身份提供商登录页面并返回安全服务器,具有不同的状态参数,但具有相同的会话 cookie(由最后一个选项卡设置)。
这些状态参数保存在现在丢失的会话中,无法验证。禁止状态参数验证失败,并发出 403 错误。
结果是除了最后一个选项卡之外的所有选项卡都以 403 页面结束。
是否有任何已知的做法可以处理这个问题?
谢谢
有趣的问题,在大多数情况下,这将是工作的一个挑战,并且需要以下方面的支持:
合规库
oidc -client-js库通过每个重定向的状态存储演示了所需的技术。正如您所说,最后一个人将获胜,而不会为最终用户带来任何错误。
这是客户端 Web UI 比服务器端 Web 堆栈(例如 ASP.Net / Spring Boot)触发的重定向具有更大控制权的可用性领域之一。
行为可视化
运行我的Online OAuth SPA并触发 2 重定向,但不要登录其中任何一个。然后浏览到此 URL 并在浏览器的本地存储工具中查看重定向状态:
最后获胜的人将更新用户存储,其数据用于后续续订重定向和令牌验证(请注意,我的 SPA 将实际令牌存储在内存中而不是此用户存储中):
授权服务器不合规
不幸的是,我的在线授权服务器(AWS Cognito)不喜欢接收这样的两次登录,并且第二次登录失败。
归档时间: |
|
查看次数: |
1351 次 |
最近记录: |