对于我正在创建的 ASP.NET Core API 应用,我无法在 JWT ID token 中显示可选声明。为了进行测试,我使用 POSTMAN 通过其内置的 Oauth2 机制获取不记名 token 。具体来说,我想要属于 MS Graph 的 user
和 profile
范围,以便我可以访问用户经过验证的电子邮件地址及其名字和姓氏。
我似乎遇到了与 this question 相同的问题- 第一部分,OP 根本无法让声明出现(例如,在调试中或通过 jwt.ms 检查 token 时),以及 this one 。在我的场景中,我仅开发一个 Web API,没有 UI 组件。预期请求将在用户上下文中发出,以便 API 可以根据用户声明执行授权。
除了连接 asp.net core API 之外,我还完成了以下操作:
配置
注册了 API 应用(所有后续操作均在 Azure 门户中完成)
- Multi-Tenancy
- 添加了所需的 MS Graph API 权限
- 为我的应用创建了自定义范围
- 在 token 配置中添加了所需的可选范围
- 在 list 中将
accessTokenAcceptedVersion
设置为2
注册了一个客户端应用(同样,在 Azure 门户中的同一租户中)
- 添加了平台 SPA(尚未使用,但这将是访问 API 的主要用例)和 native 桌面(供 POSTMAN 使用)
- 在 API 权限中,添加了我的 API 应用范围(如上所述)和 MS Graph 权限
使用 POSTMAN 进行测试
- 使用 POSTMAN 的
Oauth2
授权方法(授权类型授权代码(带 PKCE)
)设置对本地运行的 API 的请求,并使用相关的 URL 进行身份验证和 token 、客户端应用注册的客户端 ID,以及将范围设置为我的 API 的自定义范围。 - 在
身份验证
方面一切正常(我的 API 配置正确,与 API 应用注册相关联,并且 JWT 正确地传递到 API 中的我的上下文)。当POSTMAN使用浏览器进行身份验证时,同意提示会显示预期的权限。 - 但是 JWT 中不存在可选声明!
我还尝试过什么
- 将
openid 电子邮件配置文件
添加到请求的范围(没有区别) - 尝试将范围添加到客户端注册(但这有点绝望,我知道是资源而不是客户端决定了声明)
- 广泛阅读:
我希望看到从 POSTMAN 获得的不记名 token 中的附加声明,因此即使我自己的 API 没有运行,我也可以看到它们不存在。所以我怀疑我错过了一个配置步骤,而不是我的代码中有错误。
我很清楚我错过了和/或误解了一些东西,而且我陷入了困境。
最佳答案
正如评论中所讨论的,您需要在 API 的访问 token (而不是 ID token )上配置可选声明。因为您在 Postman 中获得了访问 token 。
关于asp.net-core - Azure AAD 应用程序注册 : optional claims absent from JWT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65746450/