在OAuth与Azure AD交互期间,在用户拒绝授予管理员同意范围后,Azure似乎会返回不正确的State参数值。
构建通过Azure AD v2.0端点https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
从Azure AD请求授权代码的URL时,假设我将State参数指定为a+b
。
然后url将State参数值编码为a%2Bb
,然后输入用于从Azure AD请求授权代码的URL
如果请求指定了需要管理员同意并且过去未被授予的范围,则Azure会按预期返回以下页面:
我正在尝试验证我的应用程序逻辑,以处理从Azure返回的错误。因此,我点击Return to the application without granting consent
链接即表示同意。之后,Azure预计会向我的应用程序的重定向URI返回错误响应。 Azure按如下方式填充HTTP正文中的数据:
Azure将State参数值填充为a%252bb
。这是不正确的。预期值应为a%2Bb
- 即与之前在前面描述的调用Azure授权代码请求端点时指定的值相同。看起来Azure以某种方式执行了双重URL编码 - 换句话说,编码已经url编码的State参数,将a%2Bb
更改为a%252bb
。 (%
已编码为%25
。此外,B
以某种方式成为b
似乎Azure在代码路径中存在此问题,用于处理用户单击Return to the application without granting consent
链接以拒绝管理员同意范围。对于用户拒绝用户同意范围的其他情况,Azure似乎没有此问题。 Azure为State参数返回正确的值,如下所示: