You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过JWT令牌传递Azure AD分配给用户的应用角色?

问题分析与解决方案

核心问题:误用客户端凭据流

你当前的curl请求使用了grant_type=client_credentials,但这个客户端凭据流是基于应用身份的认证方式,完全以Bar应用的身份请求令牌,不会带入任何用户(John Doe)的身份信息——哪怕你额外传入了username和password参数,这个流也不会处理用户相关的权限,所以生成的令牌里自然不会包含John的Foo.Admin角色。

另外要注意:客户端凭据流本身不支持username和password参数,这两个参数属于密码授权流的范畴,且密码流仅适合测试或特殊场景,不推荐用于生产环境。

正确处理步骤

1. 选择适配的授权流

如果要获取包含John用户应用角色的令牌,需使用以下两种流之一:

  • 授权码流:符合OAuth 2.0最佳实践,安全可靠,适合Web应用、单页应用等绝大多数场景
  • 密码授权流:仅在无法使用授权码流的临时场景下使用,不建议生产环境部署

2. 确认Foo应用的清单配置

用户的应用角色要出现在令牌中,需确保Foo应用的清单配置正确:

  • 登录Azure AD门户,找到Foo应用的注册页面
  • 切换到「清单」标签,确认appRoles数组中存在Foo.Admin的配置,格式示例如下:
{
  "allowedMemberTypes": [
    "User"
  ],
  "description": "管理Foo应用的权限",
  "displayName": "Foo.Admin",
  "id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "isEnabled": true,
  "lang": null,
  "origin": "Application",
  "value": "Foo.Admin"
}
  • 你已经配置了allowedMemberTypes为User,这部分没问题,只需确认该角色已正确分配给John Doe即可。

3. 正确的令牌请求示例

密码授权流(测试用)

curl --location --request POST 'https://login.microsoftonline.com/ebb73ad2-08da-11ed-861d-0242ac120002/oauth2/v2.0/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'username=john.doe@example.com' \
--data-urlencode 'password=1e173716-08db-11ed-861d-0242ac120002' \
--data-urlencode 'scope=api://foo/.default' \
--data-urlencode 'client_id=126ed4b4-08db-11ed-861d-0242ac120002' \
--data-urlencode 'client_secret=197710d2-08db-11ed-861d-0242ac120002'

授权码流(推荐生产用)

该流分为两步:

  1. 获取授权码(需用户在浏览器中完成登录授权):
curl --location --request GET 'https://login.microsoftonline.com/ebb73ad2-08da-11ed-861d-0242ac120002/oauth2/v2.0/authorize' \
--data-urlencode 'client_id=126ed4b4-08db-11ed-861d-0242ac120002' \
--data-urlencode 'response_type=code' \
--data-urlencode 'redirect_uri=https://your-bar-app-redirect-uri.com' \
--data-urlencode 'scope=api://foo/.default'
  1. 使用授权码换取令牌:
curl --location --request POST 'https://login.microsoftonline.com/ebb73ad2-08da-11ed-861d-0242ac120002/oauth2/v2.0/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'code=YOUR_AUTHORIZATION_CODE' \
--data-urlencode 'redirect_uri=https://your-bar-app-redirect-uri.com' \
--data-urlencode 'client_id=126ed4b4-08db-11ed-861d-0242ac120002' \
--data-urlencode 'client_secret=197710d2-08db-11ed-861d-0242ac120002'

4. 验证令牌

获取令牌后,使用JWT解码工具查看,用户的Foo.Admin角色会出现在令牌的roles声明字段中。


内容的提问来源于stack exchange,提问作者Brian Kessler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 12:36:15