首页 > 解决方案 > 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 会同时返回codeid_token.

我确实在这里发现了一个类似的问题:https ://sharepoint.stackexchange.com/questions/242669/aadsts70007-query-is-not-a-supported-value-of-response-mode-when-requesting但没有答案为那个问题提供了。

我很想知道:

标签: azureoauthazure-active-directoryopenid

解决方案


两种不同的授权流程:

所以,这两种请求是不同的 OIDC 认证流程,因为它们response_type的 s 不同。

同时,两个不同response_mode的s:

  • 对于form_post,form_post执行包含重定向 URI 代码的 POST。当授权响应打算只使用一次时,您应该使用form_postin reponse_mode。您还可以form_post本文档中查看有关的详细信息。

  • 对于query,在这种模式下,授权响应参数被编码在查询字符串中,添加到redirect_uri重定向回客户端时。有关queryin 的更多详细信息response_mode,您可以参考此文档

因此,您可能更清楚response_mode不同授权流程的不同之处。

对于授权码流,您可以使用queryor form_post,对于 Hybird 流,您可以使用form_postor fragment。对于 Web 应用程序,我们建议使用response_mode=form_post, 以确保最安全地将令牌传输到您的应用程序。(Microsoft OpenId Connect 中间件仅支持hybrid+ form_post

为什么 Azure AD 不会为较旧的应用程序抛出任何错误,而是为较新的应用程序抛出任何错误?最近在 Azure AD 级别有什么变化会导致这个问题吗?这也仅适用于较新的应用程序。

我不是 100% 确定,但 AAD 不应该改变任何关于其授权/身份验证级别的内容。也许您使用了不同类型的应用程序或身份验证流程。

有没有办法防止这个错误发生?我非常想用 queryresponse_mode代替form_post.

由于是 OIDC 框架引起的,我认为你不能query用于混合流请求form_post 。如果你的应用程序是 web 应用程序,你最好在这个流中使用。

此外,Azure 门户实际上正在使用此流程,但它可能与我们可以使用的有所不同。但是您可以通过 Fiddler 捕获其 HTTP 流量来了解身份验证/授权的工作原理。使用此流程,您必须启用您的应用程序以允许隐式流程。

您还可以在本文档中查看使用 Azure AD 和 OpenID Connect 混合流进行身份验证的示例


推荐阅读