Oauth 授权代码流-来自多个选项卡的并发请求

Oauth 授权代码流-来自多个选项卡的并发请求,oauth,state,single-sign-on,session-cookies,browser-tab,Oauth,State,Single Sign On,Session Cookies,Browser Tab,OAuth2身份验证代码流中基于cookie的会话和状态的参数处理的性质暴露了一个问题,当新浏览器会话启动时,多个选项卡试图同时打开“安全服务器”(我们的OAuth2机密客户端)上的多个链接 当浏览器启动时,它将丢弃所有以前的会话cookie。在崩溃恢复时,浏览器可以一次打开多个选项卡,用户也可以从书签文件夹或历史记录中打开多个选项卡 在这种情况下,所有选项卡将同时向安全服务器发送未经验证的请求。每个请求都将启动一个新会话和一个新的身份验证代码流,其中包含新的状态参数,该参数将保存在此会话中 所

OAuth2身份验证代码流中基于cookie的会话和状态的参数处理的性质暴露了一个问题,当新浏览器会话启动时,多个选项卡试图同时打开“安全服务器”(我们的OAuth2机密客户端)上的多个链接

当浏览器启动时,它将丢弃所有以前的会话cookie。在崩溃恢复时,浏览器可以一次打开多个选项卡,用户也可以从书签文件夹或历史记录中打开多个选项卡

在这种情况下,所有选项卡将同时向安全服务器发送未经验证的请求。每个请求都将启动一个新会话和一个新的身份验证代码流,其中包含新的状态参数,该参数将保存在此会话中

所有Secure Server重定向到标识提供程序的响应都将包含一个具有相同名称但值不同的会话cookie。它们将在浏览器中相互覆盖,并且浏览器只保留最后一个作为会话ID

每个选项卡将继续沿着授权代码流,进入身份提供商登录页面并返回安全服务器,带有不同的状态参数,但具有相同的会话cookie(由最后一个选项卡设置)

那些状态参数保存在现已丢失的会话中,无法验证状态禁止参数验证失败,并发出错误403

结果是,除最后一个选项卡外,所有选项卡都结束在403页上

是否有任何已知的做法来处理此问题


谢谢

这是一个有趣的问题,在大多数情况下,这将是一个工作上的挑战,并将得到以下方面的支持:

  • 客户端OAuth库
  • 授权服务器
兼容库

库通过每个重定向的状态存储演示所需的技术。正如您所说,最后一个人将赢得最终用户的信任,不会出现任何错误

这是一个可用性领域,客户端Web UI比服务器端Web堆栈(如ASP.Net/Spring Boot)触发的重定向具有更大的控制能力

想象行为

运行my和trigger 2重定向,但不要登录其中任何一个。然后浏览到此URL,并在重定向状态下查看浏览器的本地存储工具:

最后获胜的人将更新用户存储,其数据用于后续续订重定向和令牌验证(请注意,我的SPA将实际令牌存储在内存中,而不是此用户存储中):

不符合要求的授权服务器

不幸的是,我的在线授权服务器(AWS Cognito)不喜欢接收这样的2次登录,第二次登录失败


这似乎是一个类似的问题。但在您的情况下,错误来自身份验证服务器(或身份提供程序)-不清楚它失败的原因,因为as与重定向状态参数无关,它应该只将其传输回代码流启动器。我使用具有不同名称的cookie,并将cookie名称置于状态,安全服务器使用状态中的cookie名称来获取指定的cookie。因此,换句话说,您将状态放入cookie名称中。(您在这个cookie值中输入了什么?可能返回URL?)那么如何验证状态?检查是否有一个名为state的cookie?如果是这样,则比较两个令牌,这两个令牌都是由客户机提供的。这不是不安全吗?如果在状态中对随机值进行单向散列,有什么可以阻止攻击者替换cookie值及其在状态参数中的散列?谢谢你的提示,散列无效,我最初的想法是错误的。考虑到代码被盗,它似乎无法阻止攻击者使用自己的状态和cookie替换它们。我正在努力寻找更多的信息。现在,我想。代码被盗的责任将属于Auth服务器(代码只能使用一次,如果重复使用,所有令牌将被撤销)。此外,关于原始并发性问题,我发现了类似的答案,使用随机值作为密钥。