使用Graph API创建的Azure B2C应用获取令牌时出现invalid_grant错误
Azure B2C Client Credentials流:Graph API创建应用返回
invalid_grant错误 问题现象
通过Azure门户创建的应用,配置密钥和API权限后可正常调用B2C令牌端点获取访问令牌;但通过Graph API创建的同配置应用(清单、服务主体一致,已授予管理员同意)调用时返回如下错误:
{ "error": "invalid_grant", "error_description": "AADB2C90085: The service has encountered an internal error. Please reauthenticate and try again.\r\nCorrelation ID: a73a0250-9ee7-4cde-9754-715460bc5fe6\r\nTimestamp: 2023-07-18 20:10:01Z\r\n" }
Graph API创建应用的请求仅指定displayName:
POST /v1.0/applications HTTP/1.1 Host: graph.microsoft.com Authorization: Bearer {token from graph API application} Content-Type: application/json { "displayName": "test2" }
无论通过Graph API还是门户添加密钥,调用以下令牌端点均报错,仅替换门户应用的client_id和密钥则正常:
POST /{tenant}.onmicrosoft.com/{custom policy}/oauth2/v2.0/token?client_id={client_id}&grant_type=client_credentials&scope=https://{tenant}.onmicrosoft.com/{application id URI slug}/.default&client_secret={client_secret} HTTP/1.1 Host: devcloud9fx.b2clogin.com
解决方案
1. 修正应用的signInAudience属性
Graph API创建应用时,默认signInAudience为AzureADMyOrg,该值仅允许Azure AD租户内的身份验证,不支持B2C场景。需将其修改为B2C兼容的取值:
使用Graph API更新应用:
PATCH /v1.0/applications/{app-id} HTTP/1.1 Host: graph.microsoft.com Authorization: Bearer {token} Content-Type: application/json { "signInAudience": "AzureADandPersonalMicrosoftAccount" }
若仅针对B2C租户,也可设置为AzureADB2C(需确认租户支持该取值)。
2. 启用隐式流相关配置
部分B2C后端逻辑会检查应用的隐式流配置,即使Client Credentials流不直接依赖,仍需启用以下属性:
PATCH /v1.0/applications/{app-id} HTTP/1.1 Host: graph.microsoft.com Authorization: Bearer {token} Content-Type: application/json { "oauth2AllowIdTokenImplicitFlow": true, "oauth2AllowImplicitFlow": true }
3. 重新触发API权限的管理员同意
虽然已通过门户授予同意,但Graph API创建的服务主体可能需要重新确认权限状态:
- 进入Azure门户的B2C应用注册页面,找到Graph创建的应用
- 导航至「API权限」页面,点击「授予管理员同意」按钮,重新完成授权
4. 验证自定义策略的Client Credentials支持
确保使用的自定义策略已配置Client Credentials流支持:
- 策略中需包含
<TechnicalProfile Id="ClientCredentialsGrant">相关配置 - 检查
<RelyingParty>部分是否允许client_credentials的grant_type
验证
修改应用属性后,等待5-10分钟让配置生效,再重新调用令牌端点测试。
内容的提问来源于stack exchange,提问作者p-bednar
相关产品推荐
相关产品推荐

