Azure AD中如何为非Graph API范围的Access Token添加自定义声明
在Azure AD非Graph API资源的Access Token中添加自定义声明
我刚好处理过类似的场景,给你一步步拆解怎么实现你要的policy":"readwrite自定义声明:
核心前提说明
首先要明确:自定义声明是配置在你请求的resource对应的资源应用注册里,而不是你的客户端应用。你当前的scope指向的是https://rbsessence.onmicrosoft.com/0a7c94a0-0c4e-4f95-ba06-XXXX/.default,所以要操作的是这个ID对应的应用注册,不是你发起token请求的客户端应用。
具体操作步骤
1. 找到目标资源应用注册
登录Azure门户,进入Azure Active Directory → 应用注册,在所有应用里找到ID为0a7c94a0-0c4e-4f95-ba06-XXXX的那个应用(就是你scope里的资源应用)。
2. 添加静态自定义声明
进入该应用注册的左侧菜单,选择令牌配置:
- 点击添加声明按钮
- 在弹出的窗口里,选择自定义声明,然后填写以下信息:
- 声明名称:
policy(要和第三方要求的完全一致,大小写敏感) - 源:选择「静态」(因为你要的是固定值
readwrite) - 值:
readwrite - 令牌类型:勾选「访问令牌(Access token)」(不要选ID令牌,因为你要的是access_token里的声明)
- 声明名称:
- 点击添加保存配置
3. 确认客户端应用的权限配置
确保你的客户端应用(就是你用client_id发起请求的那个应用)已经被授予该资源应用的权限:
- 回到客户端应用的注册页面,进入API权限
- 确认已经添加了该资源应用的权限(比如你当前用的
.default范围对应的权限),并且已经点击授予管理员同意(如果是租户级权限的话)
4. 重新获取并验证Access Token
用你原来的POST请求重新获取token:
POST https://login.microsoftonline.com/{Directory (tenant) ID }/oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded password=pass&client_id=id&resource=https://graph.microsoft.com&grant_type=password&client_secret=secret&username=userName&scope=https://rbsessence.onmicrosoft.com/0a7c94a0-0c4e-4f95-ba06-XXXX/.default
拿到token后,去jwt.ms解析(或者用其他JWT解析工具),检查payload里是否包含"policy": "readwrite"字段。
额外注意事项
- 如果之后需要根据用户、组或者其他条件动态设置
policy的值,那就要用Azure AD的自定义令牌颁发策略(Custom Token Issuance Policy),不过对你当前的固定值需求来说,静态声明足够用了。 - 确保你用的是v2.0端点(你当前已经在用
oauth2/v2.0/token),v1.0端点的配置逻辑略有不同,但你当前的请求没问题。
内容的提问来源于stack exchange,提问作者Shreyas Holla P
相关产品推荐
相关产品推荐

