单独的状态参数能否为拥有机密客户端的OIDC提供足够的保护



在仔细研究OIDC规范以及大量的实现指南和文章时,我仍然无法确定单独的state参数是否可以为我的特定OIDC用例提供足够的保护,尽管它似乎应该是

  • 授权代码流
  • 不允许重复使用代码的身份验证服务器
  • 机密客户端(使用客户端机密向身份验证服务器进行身份验证(
  • 加密安全的随机state,存储在用户的会话中

是否存在任何额外措施(nonce或PKCE(提供额外保护的攻击?在我看来,以下内容已涵盖:

CSRF攻击

攻击者使用自己的帐户进行身份验证,获得授权代码,然后诱骗用户使用她的代码访问客户端的重定向端点,将用户登录到她的帐户中。防止出现这种情况:客户端将用户会话中的state(如果有(与请求中的state进行比较,发现不匹配,并拒绝请求。

代码重放攻击

用户登录后,攻击者可以访问他们的授权代码(例如,通过检查共享计算机上的浏览器历史记录(,然后将该代码与客户端的重定向端点一起使用,触发令牌交换,将攻击者登录到用户的帐户中。这种情况是可以避免的:用户以前已经用代码交换了令牌,身份验证服务器将不允许重用它。

MITM攻击

攻击者能够读取用户代理与客户端或身份验证服务器之间的明文流量(例如恶意软件、破坏TLS的公司网络(。这种情况无法缓解,因为攻击者将掌握在自己的机器上重新创建用户会话所需的所有信息。

我的理解在以上所有方面都正确吗?

state参数的一个问题是,它是客户端验证,由每个客户端验证此参数。然而,并不是每个客户端都执行此验证,这是一个问题。

通过添加PKCE,我们将获得服务器端验证,这意味着实现不好的客户端将无法进行身份验证,并且身份提供程序可以强制/要求使用PKCE。

相关内容

  • 没有找到相关文章

最新更新