Azure AADSTS70007:&x27;查询';不是支持的值';响应模式';请求令牌时

Azure AADSTS70007:&x27;查询';不是支持的值';响应模式';请求令牌时,azure,oauth,azure-active-directory,openid,Azure,Oauth,Azure Active Directory,Openid,所以几天前我在Azure广告中创建了一个应用程序。当请求授权代码时,当我同时请求code和id\u令牌(在response\u type参数中)时,我返回以下错误: AADSTS70007:“查询”在以下情况下不是“响应模式”的受支持值: 请求代币 跟踪ID:xxxx xxxx xxxx xxxx 相关ID:xxxx xxxx xxxx xxxx 时间戳:2018-06-13 16:06:03Z 我的请求URL如下所示: https://login.microsoftonline.com/com

所以几天前我在Azure广告中创建了一个应用程序。当请求授权代码时,当我同时请求
code
id\u令牌
(在
response\u type
参数中)时,我返回以下错误:

AADSTS70007:“查询”在以下情况下不是“响应模式”的受支持值: 请求代币

跟踪ID:xxxx xxxx xxxx xxxx

相关ID: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-客户端id和响应\u类型=代码+id\u令牌和重定向\u uri=urn%3AETF%3Awg%3OAuth%3A2.0%3OOB和响应\u模式=查询和非查询=1528906255418&状态=12345

然而,如果我只要求
code
而不要求
id\u令牌
,我不会得到任何错误。因此,基本上,以下URL是有效的:

https://login.microsoftonline.com/common/oauth2/authorize?resource=https%3A%2F%2Fmanagement.core.windows.net%2F&client_id=application-客户端id和响应\u类型=代码和重定向\u uri=urn%3AETF%3Awg%3OAuth%3A2.0%3OOB和响应\u模式=查询和非查询=1528906255418&状态=12345

更有趣的是,如果我使用几个月前创建的应用程序的客户端id,代码工作得非常好,Azure AD将
code
id\u令牌
返回给我

我确实在这里发现了一个类似的问题:但没有为这个问题提供答案

我很想知道:

  • 为什么Azure AD不会为较旧的应用程序而为较新的应用程序抛出任何错误?最近Azure广告级别是否发生了导致此问题的任何更改?这也仅适用于较新的应用程序
  • 有没有办法防止这种错误发生?我非常想使用
    query
    作为
    response\u模式
    而不是
    form\u post
两种不同的授权流程:
  • 如果要在
    响应类型
    中使用
    code+id\u令牌
    ,则应使用

  • 但是,如果您只是在
    响应类型中使用
    code
    ,则应该使用

因此,这两种请求是不同的OIDC身份验证流,因为它们的
响应类型不同

同时,两种不同的
响应模式
s:
  • 对于
    form\u post
    form\u post
    执行一个包含重定向URI代码的post。当授权响应只打算使用一次时,您应该在
    响应模式下使用
    form\u post
    。您还可以在中查看有关
    form\u post
    的详细信息

  • 对于
    query
    ,在此模式下,当重定向回客户端时,授权响应参数将编码在添加到
    redirect\u uri
    的查询字符串中。有关
    response\u模式下的
    query
    的更多详细信息,请参阅

因此,对于不同的授权流,您可能会更清楚地了解不同的
响应\u模式

对于授权代码流,您可以使用
query
form\u post
;对于Hybird流,您可以使用
form\u post
fragment
。对于web应用程序,我们建议使用
response\u mode=form\u post
,以确保令牌最安全地传输到您的应用程序。(Microsoft OpenId Connect中间件仅支持
混合
+
表单发布

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

我不是100%确定,但是AAD不应该改变它的授权/认证级别。可能您使用了不同类型的应用程序或身份验证流

有没有办法防止这种错误发生?我非常愿意 喜欢使用查询作为
response\u模式
而不是
form\u post

由于原因是OIDC框架造成的,我认为您不能对hybird流请求使用
query
。您最好使用
form\u post
如果您的应用程序是web应用程序,则在此流程中

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


您还可以查看是否使用Azure AD和OpenID Connect混合流进行身份验证。

为了完整性起见,添加了一个答案。韦恩的回答帮了大忙

因此,我没有使用
response\u type=query
,而是使用
response\u type=fragment
,我的新请求URL现在如下所示:

https://login.microsoftonline.com/common/oauth2/authorize?resource=https%3A%2F%2Fmanagement.core.windows.net%2F&client_id=application-客户端id和响应\u类型=代码+id\u令牌和重定向\u uri=urn%3AETF%3Awg%3OAuth%3A2.0%3OOB和响应\u模式=片段和非片段=1528906255418和状态=12345

我能够拿回
code
id\u令牌
: urn:ietf:wg:oauth:2.0:oob#code=code&id#u-token=id#u-token&state=12345&session#u-state=c6989d04-48ff-40cd-86ac-0cd2670ee168


删除
urn:ietf:wg:oauth:2.0:oob#
,然后解析剩余的字符串以获得应用程序中的
code
id\u令牌
值。

非常感谢@Wayne Yang提供如此详细的解释!让我读更多关于它的内容,并带着我可能有的任何问题回来。嗨@GauravMantri,如果您还有任何问题,请随时通知我