azure-ad-b2c -如何防止Oauth授权码的重复使用?

slmsl1lt  于 2023-02-13  发布在  其他
关注(0)|答案(2)|浏览(232)

我使用的是OAuth 2.0授权代码流,但我注意到我可以重用相同的授权代码,并且服务器会使用新的id令牌进行响应。
根据OAuth 2.0规范,客户端不得重复使用相同的授权码(https://www.rfc-editor.org/rfc/rfc6749#section-4.1.2)
我的策略中是否缺少任何设置?我在AzureB 2C中找到的关于代码授权代码流的唯一文档如下:https://learn.microsoft.com/en-us/azure/active-directory-b2c/configure-tokens?pivots=b2c-custom-policy#authorization-code-lifetime

编辑:
我使用以下端点生成了身份验证代码:

https://tenant.b2clogin.com/tenant/policy/oauth2/v2.0/authorize?client_id=clientid&response_type=code&redirect_uri=https://jwt.ms&scope=openid&response_mode=query&code_challenge=codechallenge&code_challenge_method=S256

我使用如下参数生成了访问令牌:

但仍然能够使用相同的代码生成令牌

这是我的新应用程序:

vm0i2vca

vm0i2vca1#

我尝试在我的环境中重现相同的错误,但在尝试重用auth-code时出现如下错误:

我创建了Azure AD B2C应用程序并添加了SPA重定向URI,如下所示:

我使用以下端点生成了auth-code

https://tenant.b2clogin.com/tenant.onmicrosoft.com/policy/oauth2/v2.0/authorize?
client_id=ClientID
&response_type=code
&redirect_uri=RedirectUri
&response_mode=query
&scope=scope
&state=state
&code_challenge=codechallenge
&code_challenge_method=S256

我使用如下参数生成了访问令牌

https://tenant.b2clogin.com/tenant.onmicrosoft.com/policy/oauth2/v2.0/token 

grant_type=authorization_code
&client_id=ClientID
&scope=scope
&redirect_uri=redirectUri
&code_verifier=codeverifier

当我尝试重用代码时,我得到了如下错误:

    • 注意**:默认情况下,Azure AD B2C中的身份验证代码生存期为10分钟,并且无法更改。
  • 默认情况下,如果已使用身份验证代码,Azure AD B2C将不会生成令牌。
  • 确保使用https传输身份验证码。
  • 生成身份验证码时,请确保在authorize端点中使用**prompt**登录时收到提示。
  • 如果问题仍然存在,请尝试注册新的应用程序并进行检查。
    • 参考:**

更新和重大更改-Microsoft Entra

6ie5vjzr

6ie5vjzr2#

如果您没有使用nonce声明,则此预期行为是由于B2C的已知限制。
根据RFC (6749) - The OAuth 2.0 Authorization Framework
验证码只能使用一次。
对于标准Azure AD,2018年发布了一个修复程序:
Azure Active Directory中断更改引用|微软文档
这是因为B2C是无状态的,在这里不遵循OTP RFC标准。标准Azure AD早在2018年就制定了跟踪和使AuthZ代码无效的工程规定,但Azure AD B2C尚未完成这项工作。B2C必须成为有状态服务,这是一项重大投资。因此,虽然这是一个已知问题,但这项工作目前尚未完成。
解决方法是使用nonce claim
另请参阅:B2C nonce

相关问题