如何在Azure AD客户端-服务器应用中获取含自定义声明的Access Token?
解决Azure AD获取自有Web API Access Token并包含指定声明的问题
先搞定核心问题:拿到针对自有Web API的Token(不是MS Graph的)
你之前大概率踩了个常见坑——请求Token时用了MS Graph的scope,导致拿到的是给Graph的Token。要拿到自有API的Token,按下面步骤来:
- 注册你的Web API应用
- 进入Azure AD门户新建应用注册,选择「Web API」类型
- 进入「公开API」页面,添加一个自定义范围(比如
api://{你的Web API应用ID}/access_as_user),用户同意类型选「管理员和用户」即可
- 给客户端应用配置权限
- 打开桌面客户端应用的注册页,进入「API权限」→「添加权限」→「我的API」,选择刚才注册的Web API
- 添加上一步创建的自定义范围,然后点击「授予管理员同意」(试用租户里你自己就是管理员,直接操作就行)
- 请求Token时用对scope
不管是授权请求还是Token交换请求,scope参数必须使用你Web API的自定义范围,比如api://{Web API应用ID}/access_as_user offline_access,绝对不能用https://graph.microsoft.com/.default这类MS Graph的scope,否则拿到的肯定是给Graph的Token
再解决声明问题:让Access Token包含preferred_username和groups
注意:可选声明要配置在Web API应用(资源端),不是客户端应用,之前你可能配错地方了!
1. 添加preferred_username声明
- 打开Web API应用的注册页,进入「令牌配置」→「添加可选声明」
- 选择「Access Token」,勾选
preferred_username,点击「添加」 - 确认Web API应用的manifest中
accessTokenAcceptedVersion设置为2(只有v2版本的Token支持把这个声明放进Access Token)
2. 添加groups声明
- 打开Web API应用的manifest,修改
groupMembershipClaims字段:- 只需要安全组的话,设置为
"groupMembershipClaims": "SecurityGroup" - 需要所有组类型的话,设置为
"groupMembershipClaims": "All"
- 只需要安全组的话,设置为
- 同样确保
accessTokenAcceptedVersion为2 - 小提示:如果用户所在组数量超过150个,Azure AD不会直接在Token里返回groups声明,需要通过MS Graph API查询,但POC阶段组数量少,不会有这个问题
验证用的请求格式(带PKCE的Authorization Code Flow)
授权请求(GET)
https://login.microsoftonline.com/{你的租户ID}/oauth2/v2.0/authorize?client_id={客户端应用ID}&response_type=code&redirect_uri={客户端重定向URI}&response_mode=query&scope=api://{Web API应用ID}/access_as_user offline_access&code_challenge={PKCE挑战码}&code_challenge_method=S256
Token交换请求(POST)
POST https://login.microsoftonline.com/{你的租户ID}/oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded client_id={客户端应用ID}&grant_type=authorization_code&code={拿到的授权码}&redirect_uri={客户端重定向URI}&code_verifier={PKCE验证码}&scope=api://{Web API应用ID}/access_as_user offline_access
拿到Token后用jwt.ms解析,检查aud字段是否为你的Web API应用ID,同时确认preferred_username和groups声明是否存在。
内容的提问来源于stack exchange,提问作者bc thales
相关产品推荐
相关产品推荐

