Azure AAD 应用注册:JWT 中缺少可选声明

Posted

技术标签:

【中文标题】Azure AAD 应用注册:JWT 中缺少可选声明【英文标题】:Azure AAD app registration: optional claims absent from JWT 【发布时间】:2021-04-21 02:15:03 【问题描述】:

对于我正在创建的 asp.net 核心 API 应用程序,我无法在 JWT ID 令牌中显示可选声明。为了测试,我使用 POSTMAN 通过其内置的 Oauth2 机制获取 Bearer 令牌。具体来说,我想要属于 MS Graph 的 userprofile 范围,以便我可以访问用户的已验证电子邮件地址以及他们的名字和姓氏。

我似乎有与this question 相同的问题 - 第一部分,OP 根本无法获得声明(例如,在调试或通过 jwt.ms 检查令牌时)和this one .在我的场景中,我只开发了一个没有 UI 组件的 Web API。期望是在用户上下文中发出请求,以便 API 可以根据用户声明执行授权。

除了连接 asp.net 核心 API 之外,我还做了以下工作:

配置

    注册了 API 应用(以下所有操作都在 Azure 门户中完成)

    多租户 添加了所需的 MS Graph API 权限 为我的应用创建了自定义范围 在令牌配置中添加了所需的可选范围 在清单中将 accessTokenAcceptedVersion 设置为 2

    注册了一个客户端应用程序(同样,在 Azure 门户中,在同一租户中)

    添加了平台 SPA(尚未使用,但这将是访问 API 的主要用例)和本机桌面(供 POSTMAN 使用) 在 API 权限中,添加了我的 API 应用范围(如上)和 MS Graph 权限

使用 POSTMAN 进行测试

使用 POSTMAN 的 Oauth2 授权方法和授权类型 Authorization Code (With PKCE) 并使用相关 URL 进行身份验证和令牌、客户端应用注册的客户端 ID 并将范围设置为我的 API 的自定义范围。 一切都按照Authentication 工作(我的 API 配置正确,与 API 应用注册相关联,并且 JWT 正确地通过我在 API 中的上下文)。同意提示显示 POSTMAN 使用浏览器获取身份验证时的预期权限。 但是 JWT 中不存在可选声明!

我还尝试了什么

openid email profile 添加到请求的范围(没有区别) 尝试将范围添加到客户端注册(但这有点绝望,我知道决定声明的是资源,而不是客户端) 广泛阅读: Optional claims doco ID tokens doco Identity platform permissions/consent doco SPA (and other platforms) auth scenario doco

我希望在我从 POSTMAN 获得的 Bearer 令牌中看到额外的声明,所以即使我自己的 API 没有运行,我已经可以看到它们不存在。所以我怀疑我错过了一个配置步骤,而不是我的代码中有错误。

我很清楚我在这里错过和/或误解了一些东西,我被困住了。

【问题讨论】:

您是否在 API 的 访问令牌 上配置了可选声明?因为这是你在获取 API 令牌后在 Postman 中得到的。 @juunas 我会仔细检查 哇哦,原来如此。我误解并将其全部设置在 ID 令牌上!谢谢@juunas,如果你想添加我会接受的答案。 【参考方案1】:

如 cmets 中所述,您需要为 API 配置 访问令牌 上的可选声明,而不是 ID 令牌。由于您在 Postman 中获得了访问令牌。

【讨论】:

以上是关于Azure AAD 应用注册:JWT 中缺少可选声明的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法在 Azure 门户中访问我的 AAD 应用注册,但我可以使用 Azure CLI 查看它?

从 AAD Azure 验证 JWT access_token 失败

向 AAD B2C 注册 AzureFunctions 应用程序

如何使用MSAL.js为Azure DevOps获取有效的AAD v2令牌

AAD B2C 中具有客户端凭据授予流的 Azure 应用服务轻松身份验证

ReactJS在我的天蓝色租户中注册