使用Microsoft Graph v1.0应用权限调用CreateOrGet创建Online Meeting返回Forbidden求助
关于使用应用权限调用Microsoft Graph v1.0
CreateOrGet接口创建Online Meeting的问题 问题背景
是否有开发者成功通过Application权限调用Microsoft Graph v1.0的CreateOrGet请求来创建Online Meeting?我已在Azure门户创建应用,使用客户端ID与密钥完成了GraphServiceClient的初始化。
我有一个部署在Hangfire Server上的服务,无需用户交互即可执行后台异步流程与通知推送。其中一项功能是发送嵌入Teams在线会议链接的组织通知,为此我尝试使用Client Credential流。
已配置权限说明
我的访问令牌中包含以下权限声明:
"roles": [ "OnlineMeetings.Read.All", "OnlineMeetings.ReadWrite.All", "User.Read.All" ]
![Azure门户权限配置截图]
截图第一列的权限名称被截断,但所需的委托权限与应用权限均已配置完毕;虽然几天前的截图未包含User.Read.All的应用权限,但我已为所有应用权限获取了管理员授权,图中打码的内容为目录名称。
相关实现代码
我使用Client Credentials Provider编写的代码如下:
//Client Credentials - Application app = ConfidentialClientApplicationBuilder .Create(config.Value.ClientId) .WithTenantId(config.Value.Tenant) .WithClientSecret(config.Value.ClientSecret) .Build(); var scopes = new string[] { "https://graph.microsoft.com/.default" }; graphClient = new GraphServiceClient(new DelegateAuthenticationProvider(async (requestMessage) => { // 获取微软Graph的访问令牌(需要时自动刷新) authResult = await app .AcquireTokenForClient(scopes) .ExecuteAsync(); // 将访问令牌添加到请求头的Authorization字段 requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken); _logger.LogInformation("Token included in GraphClient: " + authResult.AccessToken); }); OnlineMeeting onlineMeeting = new OnlineMeeting() {.....} var user = await graphClient.Users[{userPrincipalName}].Request().GetAsync(); // 带User.Read.All权限时该接口调用正常 _logger.LogInformation("User: " + JsonConvert.SerializeObject(user, serializerSettings)); string meetingId = Guid.NewGuid().ToString(); OnlineMeeting createdMeeting = await graphClient.Users[user.Id].OnlineMeetings.CreateOrGet(meetingId, null, onlineMeeting.EndDateTime, onlineMeeting.Participants, onlineMeeting.StartDateTime, onlineMeeting.Subject).Request().PostAsync(); // 该接口调用失败,抛出ServiceException
报错信息
调用创建会议接口时收到的错误信息如下:
StatusCode: Forbidden ResponseBody: { "error": { "code": "Forbidden", "message": "Application does not have permission to CreateOrGet online meeting on behalf of this user.", "innerError": { "date": "2021-03-26T15:55:22", "request-id": "6e8466cb-807a-44df-93bf-27d42c413e44", "client-request-id": "6e8466cb-807a-44df-93bf-27d42c413e44" } } }
请分析该问题的可能原因。
问题根因与解决思路
这个报错不是权限额度没开够,是CreateOrGet接口的校验逻辑和普通Graph接口有差异:
- 你当前代码调用的是绑定用户节点的版本(对应路由
/users/{user-id}/onlineMeetings/createOrGet),这个路由原生不支持纯应用权限(Client Credential流)调用。哪怕给应用配齐了全量OnlineMeetings应用权限,只要请求路径绑定了具体用户ID,系统就会强制要求请求携带用户委托上下文,没有登录用户的身份上下文就直接返回403。 - 目前支持无用户交互调用的创建会议能力,是独立的应用级路由,和用户节点下的路由是两套独立的校验逻辑,不能混用。
具体排查与修复步骤:
- 先确认Azure门户中配置的
OnlineMeetings.ReadWrite.All是应用权限,而非委托权限。很多开发者配置时会误选权限类型,保存后没有触发管理员全租户授权,最终访问令牌里根本没带上对应的角色声明。你可以解码本地缓存的访问令牌,检查roles数组里是否真的存在这个权限项,排除委托权限混同的问题。从你当前能正常调用用户信息接口的表现来看,User.Read.All的应用权限是生效的,可以排除令牌获取失败、应用基础配置错误的问题。 - 去掉请求路由里的用户节点绑定,无用户交互场景下不要走用户路径的方法,显式在请求体中指定会议组织者信息,不要通过URL路径隐式绑定用户身份。
- 补充前置校验:就算Graph权限配置完全正确,作为会议组织者的账号必须在Teams管理中心开启「允许第三方应用创建在线会议」的策略权限,默认状态下这个策略是关闭的,没开的话哪怕Graph接口权限够了,也会被业务层拦截。
内容的提问来源于stack exchange,提问作者yomer
相关产品推荐
相关产品推荐

