首页 > 解决方案 > 在 OpenID Connect with PKCE 中,客户端如何知道用户重定向后使用哪个 code_verifier 发送哪个授权码?

问题描述

我正在参加关于 OpenID Connect 授权代码工作流的 ASP.NET 安全课程,该课程具有 PKCE 保护以防止代码重放攻击。这个过程有一个方面我不明白。

过程:

  1. 依赖客户端生成PKCE code_verifier,哈希成code_challenge,以code_challenge作为查询参数将用户发送到授权服务器。

  2. 授权服务器存储code_challenge,发布授权码,并使用授权码将用户重定向回客户端。

  3. 客户端将授权码连同原始的 code_verifier 一起发送以交换令牌。授权服务器在颁发令牌之前验证 code_verifier 确实散列到 code_challenge 中。

我的问题是第 3 步:由于 HTTP 是无状态的,客户端如何知道要与授权码一起发送哪个 code_verifier?此 code_verifier 是否存储在用户代理的 cookie 中?

标签: oauth-2.0asp.net-identityidentityserver4openid-connect

解决方案


PKCE 最初是为移动客户端设计的,它们通常只发出一个授权请求。但现在建议所有使用授权代码流的客户端。

您是正确的,如果客户端是为许多用户提供服务的 Web 应用程序,则客户端应用程序需要将正确的 code_verifier 与授权请求相关联。

如您所说,客户端可以将 code_verifier 存储在 cookie 中,因此它将与授权码一起发送给客户端。

或者它可以将它存储在客户端的服务器端,并将状态参数中的密钥粘贴到授权请求中。如果与授权请求一起传递,状态将成为对 redirect_uri 调用的一部分。


推荐阅读