Azure active directory OAuth with Azure Active Directory:Azure AD在拒绝管理员同意作用域后返回不正确的状态参数值
在OAuth与Azure AD交互期间,在用户拒绝授予管理员同意范围后,Azure似乎返回了不正确的状态参数值 通过Azure AD v2.0端点构建用于从Azure AD请求授权代码的URL时Azure active directory OAuth with Azure Active Directory:Azure AD在拒绝管理员同意作用域后返回不正确的状态参数值,azure-active-directory,Azure Active Directory,在OAuth与Azure AD交互期间,在用户拒绝授予管理员同意范围后,Azure似乎返回了不正确的状态参数值 通过Azure AD v2.0端点构建用于从Azure AD请求授权代码的URL时https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize,假设我将状态参数指定为a+b。 然后url将状态参数值编码为a%2Bb,然后放入url以从Azure AD请求授权代码 如果请求指定了需要管理员同意且过去未授予的作用域,Azu
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
,假设我将状态参数指定为a+b
。
然后url将状态参数值编码为a%2Bb
,然后放入url以从Azure AD请求授权代码
如果请求指定了需要管理员同意且过去未授予的作用域,Azure将按预期返回以下页面:
我试图验证我的应用程序逻辑,以处理从Azure返回的错误。因此,我通过单击“返回应用程序而不授予许可”链接拒绝了此同意。之后,Azure预期会返回一个错误响应到我的应用程序的重定向URI。Azure将数据填充到HTTP正文中,如下所示:
Azure将状态参数值填充为a%252bb
。这是不对的。预期值应为a%2Bb
——即与前面所述调用Azure授权代码请求端点时指定的值相同。看起来Azure以某种方式执行了双重URL编码——换句话说,对已经进行URL编码的状态参数进行编码,将a%2Bb
更改为a%252bb
。(%
被编码为%25
。此外,B
以某种方式变成B
,这很奇怪。)
Azure似乎在处理用户的代码路径中存在此问题,用户单击返回应用程序而不授予同意
链接拒绝管理员同意范围。对于用户拒绝用户同意范围的其他场景,Azure似乎没有此问题。Azure为状态参数返回正确的值,如下所示:
我今天又试了一次。看起来Microsoft刚刚删除了未经同意返回应用程序的
链接。所以这篇文章前面提到的问题已经不存在了
无法使用类似https://login.microsoftonline.com/adfei.onmicrosoft.com/oauth2/v2.0/authorize?response_type=token+id_令牌和客户端_id=57336bd5-a80f-4b48-a29a-07fdea6ef91e和重定向_uri=http://localhost&scope=openid+Directory.Read.All&state=a+b&nonce=123&response\u mode=form\u post
。您可以共享帮助查找此问题的确切请求。您尝试的URL似乎用于隐式授权流(response\u type=token+id\u token
)。当我看到这个问题时,我使用了授权代码流(response\u type=id\u token+code
)。这是我用于从Azure AD请求授权代码的编码URL:https://login.microsoftonline.com/{tenant\u id}/oauth2/v2.0/authorize?响应\u mode=form\u post&nonce={nonce\u value}&response\u type=id\u令牌%20code&client\u id={client\u id}&redirect_uri=http%3A%2F%2LocalHost&scope=openid%20email%20profile%20offline_access%20Group.ReadWrite.All&state=a%2Bb
我也在使用上述请求进行测试,但仍然无法再现此问题。以下是供您参考的请求:https://login.microsoftonline.com/adfei.onmicrosoft.com/oauth2/v2.0/authorize?response_mode=form_post&nonce=abc&response_type=id_token 代码和客户端id=57336bd5-a80f-4b48-a29a-07fdea6ef91e和重定向=http://localhost&scope=openid 电子邮件配置文件脱机\u访问组.ReadWrite.All&state=a%2Bb
。无论我用a+b
或a%2Bb
传递状态,它都会返回正确的值。唯一的区别是该值不区分大小写。