Azure AD:带有 PKCE 的代码流:没有为应用程序启用 id_token

Posted

技术标签:

【中文标题】Azure AD:带有 PKCE 的代码流:没有为应用程序启用 id_token【英文标题】:Azure AD: code flow with PKCE: id_token is not enabled for the application 【发布时间】:2021-01-06 11:13:51 【问题描述】:

我正在尝试将 React 单页应用 (SPA) 与 Azure AD 集成。我正在关注文档(例如 scenario)并使用来自 react-aad-msal 的示例来查看事情是否在基本层面上有效。

但是,我在尝试访问 Microsoft 登录页面时收到以下错误:

AADSTS700054:没有为应用程序启用 response_type 'id_token'。

现在,文档非常清楚,对于 SPA,使用 PKCE 的身份验证代码流是可行的方法,而您 shouldn't use the implicit grant flow 因为 it's insecure。这意味着对类似问题(例如 this one 或 this other one)的现有答案(建议盲目地打开隐式流的设置)是不够的。

是否可以在不使用隐式流的情况下为 SPA 启用登录(ID 令牌)和 API 访问(访问令牌)?

(我还不确定,但也有可能react-aad-msal 正在使用隐式流。我还没有找到任何可以告诉它使用哪个流的设置。) p>

【问题讨论】:

【参考方案1】:

react-aad-msal 实际上并没有说明它使用的是哪个版本的 MSAL。现在有2 versions:

MSAL 1.x 仅支持隐式流。 MSAL 2.0 支持使用 PKCE 的身份验证代码流

react-aad-msaljavascript 示例的 package.json 文件显然使用 MSAL 1.x:

    "msal": "^1.2.0",

所以这就是我的问题所在。隐式流动。不能将react-aad-msal 用于 PKCE 的身份验证代码流。

【讨论】:

【参考方案2】:

我遇到了 Blazor WASM(.NET 6 以及所有最新库),但我认为我的解决方案可能仍然适用于某些人。

在尽可能接近教程here 之后,我仍然收到“id_token 未启用”消息。我注意到让我很困惑的一件事是关于注册客户端应用程序的教程的这一部分:

但是,如果您查看 Azure 门户,实际的复选框似乎是相反的:

我将此归结为教程中的一个错误,并让他们未经检查认为应该允许我使用身份验证代码流。尝试了一切,但仍然收到相同的消息。准备好讨论整个问题,我启用了访问令牌和 ID 令牌。

开始工作了!但是查看网络流量,它实际上是在访问应用程序时多次调用 /authorize 端点。第一次使用response_type=id_token,然后使用response_type=code

最终意识到这是由应用服务上部署的 /authsettings 资源引起的。 Azure 正在尝试使用 response_type=id_token 向应用服务本身验证我的身份。

在迁移到没有任何身份验证设置的新应用服务后,仅依靠应用的配置来重定向未经身份验证的用户,身份验证代码流工作,并且应用注册中的复选框未选中。

【讨论】:

以上是关于Azure AD:带有 PKCE 的代码流:没有为应用程序启用 id_token的主要内容,如果未能解决你的问题,请参考以下文章

我可以在没有客户端密码的情况下使用带有 PKCE 的 IdentityServer3 授权代码流吗?

继续与 OIDC JS 客户端和身份服务器进行会话 4 授权流与 Azure 应用服务上的 PKCE 流

使用 PKCE 的授权代码流如何比没有 client_secret 的授权代码流更安全

在 PKCE 增强的授权代码流中保护 code_verifier 的最佳实践

将 Google OIDC 与代码流和 PKCE 结合使用

服务主体的Azure AD OIDC ID令牌