因此,几天前我在 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.
但是,如果您只是使用code
in the response_type
,你应该使用授权码流程 http://openid.net/specs/openid-connect-core-1_0.html#CodeFlowSteps.
所以,这两种请求由于它们的不同,是不同的OIDC认证流程response_type
s.
与此同时,两个不同的response_mode
s:
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(使用前将#替换为@)