azure - AADSTS70007:请求令牌时,“query”不是“response_mode”的受支持值
问题描述
所以几天前我在 Azure AD 中创建了一个应用程序。code
请求授权码时,当我同时要求和id_token
(在response_type
参数中)时,我收到以下错误:
AADSTS70007:请求令牌时,“query”不是“response_mode”的受支持值
跟踪 ID:xxxx-xxxx-xxxx-xxxx-xxxx
相关 ID:xxxx-xxxx-xxxx-xxxx-xxxx
时间戳:2018-06-13 16:06:03Z
我的请求 URL 如下所示:
https://login.microsoftonline.com/common/oauth2/authorize?resource=https%3A%2F%2Fmanagement.core.windows.net%2F&client_id=application-client-id&response_type=code+id_token&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_mode=query&nonce=1528906255418&state=12345
但是,如果我只要求code
而不是id_token
. 因此,基本上,以下 URL 有效:
https://login.microsoftonline.com/common/oauth2/authorize?resource=https%3A%2F%2Fmanagement.core.windows.net%2F&client_id=application-client-id&response_type=code&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_mode=query&nonce=1528906255418&state=12345
更有趣的是,如果我使用几个月前创建的应用程序的客户端 ID,代码可以正常工作,Azure AD 会同时返回code
和id_token
.
我确实在这里发现了一个类似的问题:https ://sharepoint.stackexchange.com/questions/242669/aadsts70007-query-is-not-a-supported-value-of-response-mode-when-requesting但没有答案为那个问题提供了。
我很想知道:
- 为什么 Azure AD 不会为较旧的应用程序抛出任何错误,而是为较新的应用程序抛出任何错误?最近在 Azure AD 级别有什么变化会导致这个问题吗?这也仅适用于较新的应用程序。
- 有没有办法防止这个错误发生?我非常想使用
query
asresponse_mode
而不是form_post
.
解决方案
两种不同的授权流程:
如果你想在 中使用
code + id_token
,response_type
你应该使用OIDC Hybrid Flow。但是,如果您只是在 中使用
code
,则response_type
应该使用Authorization Code flow。
所以,这两种请求是不同的 OIDC 认证流程,因为它们response_type
的 s 不同。
同时,两个不同response_mode
的s:
对于
form_post
,form_post
执行包含重定向 URI 代码的 POST。当授权响应打算只使用一次时,您应该使用form_post
inreponse_mode
。您还可以form_post
在本文档中查看有关的详细信息。对于
query
,在这种模式下,授权响应参数被编码在查询字符串中,添加到redirect_uri
重定向回客户端时。有关query
in 的更多详细信息response_mode
,您可以参考此文档。
因此,您可能更清楚response_mode
不同授权流程的不同之处。
对于授权码流,您可以使用query
or form_post
,对于 Hybird 流,您可以使用form_post
or fragment
。对于 Web 应用程序,我们建议使用response_mode=form_post
, 以确保最安全地将令牌传输到您的应用程序。(Microsoft OpenId Connect 中间件仅支持hybrid
+ form_post
)
为什么 Azure AD 不会为较旧的应用程序抛出任何错误,而是为较新的应用程序抛出任何错误?最近在 Azure AD 级别有什么变化会导致这个问题吗?这也仅适用于较新的应用程序。
我不是 100% 确定,但 AAD 不应该改变任何关于其授权/身份验证级别的内容。也许您使用了不同类型的应用程序或身份验证流程。
有没有办法防止这个错误发生?我非常想用 query
response_mode
代替form_post
.
由于是 OIDC 框架引起的,我认为你不能query
用于混合流请求form_post
。如果你的应用程序是 web 应用程序,你最好在这个流中使用。
此外,Azure 门户实际上正在使用此流程,但它可能与我们可以使用的有所不同。但是您可以通过 Fiddler 捕获其 HTTP 流量来了解身份验证/授权的工作原理。使用此流程,您必须启用您的应用程序以允许隐式流程。
推荐阅读
- angular - 表单的设置值
- c - C中矩阵和向量乘法的优化
- grails - 是否可以访问 creatCriteria 中的属性值?
- c# - 如何将 URL 中的 ID 传递到下一页
- javascript - 使用 JS 和 PHP 将 textarea 数据发送到文件并保留换行符
- php - 在 Laravel 中与 Repository Pattern 建立雄辩的关系
- javascript - 循环遍历对象数组并创建一个新对象
- wordpress - Wordpress / CMB2 框架 / 在前端显示来自可重复字段的数据
- dbcontext - 使用 .Net Core 2.1 / EF Core 连接两个独立数据库中的表
- c# - 如何配置 Visual Studio 2017 android 模拟器以在 localhost 上工作