AADSTS70007:请求令牌时,“query”不是“response_mode”受支持的值

2024-03-24

因此,几天前我在 Azure AD 中创建了一个应用程序。请求授权码时,当我请求两者时,我收到以下错误code and id_token (in 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 and id_token.

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

我很想知道:

  • 为什么 Azure AD 对于较旧的应用程序不会抛出任何错误,而对于较新的应用程序则不会抛出任何错误?最近 Azure AD 级别是否有任何更改会导致此问题?这也仅适用于较新的应用程序。
  • 有没有办法防止这个错误的发生?我非常想用query as response_mode代替form_post.

两种不同的授权流程:

  • 如果你想使用code + id_token in the response_type,你应该使用OIDC 混合流 http://openid.net/specs/openid-connect-core-1_0.html#HybridFlowAuth.

  • 但是,如果您只是使用codein the response_type,你应该使用授权码流程 http://openid.net/specs/openid-connect-core-1_0.html#CodeFlowSteps.

所以,这两种请求由于它们的不同,是不同的OIDC认证流程response_types.

与此同时,两个不同的response_modes:

  • For form_post, form_post执行包含重定向 URI 代码的 POST。当授权响应仅使用一次时,您应该使用form_post in reponse_mode。您还可以查看有关的详细信息form_post in 本文档 https://openid.net/specs/oauth-v2-form-post-response-mode-1_0.html#FormPostResponseMode.

  • For query,在此模式下,授权响应参数被编码在添加到查询字符串中redirect_uri当重定向回客户端时。有关更多详细信息query in response_mode,你可以参考本文档 https://openid.net/specs/oauth-v2-multiple-response-types-1_0.html#ResponseModes.

那么,您可能更清楚不同的情况response_mode针对不同的授权流程。

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

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

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

有没有办法防止这个错误的发生?我非常愿意 喜欢使用查询作为response_mode代替form_post.

由于原因是OIDC框架引起的,我认为你不能使用query对于混合流请求。你最好使用form_post如果您的应用程序是网络应用程序,则在此流程中。

额外的,Azure 门户 https://portal.azure.com实际使用的是这个流程,但是可能和我们能用的有点不一样。但是您可以通过 Fiddler 捕获 HTTP 流量来了解身份验证/授权的工作原理。通过此流程,您必须使您的应用程序允许隐式流程。

您还可以看到这个样本 https://github.com/mspnp/multitenant-saas-guidance使用 Azure AD 和 OpenID Connect 混合流进行身份验证本文档 https://learn.microsoft.com/en-us/azure/architecture/multitenant-identity/authenticate.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AADSTS70007:请求令牌时,“query”不是“response_mode”受支持的值 的相关文章

随机推荐