如何通过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'
授权码流(推荐生产用)
该流分为两步:
- 获取授权码(需用户在浏览器中完成登录授权):
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'
- 使用授权码换取令牌:
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
相关产品推荐
相关产品推荐

