使用Bot Framework调用GetTeamChannelsAsync()时遇MSTeams Forbidden错误
解决Bot Framework获取Teams频道列表时的Forbidden错误(2024年4月后)
问题重现
此前正常运行的代码,自2024年4月15日起调用TeamsInfo.GetTeamChannelsAsync(turnContext)时持续返回Forbidden错误,具体信息如下:
Error message:Operation returned an invalid status code 'Forbidden' |
{"error":{"code":"ServiceError","message":"Unknown"}}
错误调用栈:
at Microsoft.Bot.Connector.Teams.TeamsOperations.GetResponseAsync[T](String apiUrl, String httpMethod, String invocationId, Object content, Dictionary`2 customHeaders, String continuationToken, CancellationToken cancellationToken) at Microsoft.Bot.Connector.Teams.TeamsOperations.FetchChannelListWithHttpMessagesAsync(String teamId, Dictionary`2 customHeaders, CancellationToken cancellationToken) at Microsoft.Bot.Connector.Teams.TeamsOperationsExtensions.FetchChannelListAsync(ITeamsOperations operations, String teamId, CancellationToken cancellationToken) at Microsoft.Bot.Builder.Teams.TeamsInfo.GetTeamChannelsAsync(ITurnContext turnContext, String teamId, CancellationToken cancellationToken) at Microsoft.BotBuilderSamples.WelcomeUserBot.OnInstallationUpdateAddAsync(ITurnContext`1 turnContext, CancellationToken cancellationToken)
关键差异点:
- 本地通过ngrok测试Bot服务时一切正常,部署到Azure App Service后出错
- 所有Bot均出现该问题,仅新版Teams受影响,旧版Teams正常
排查与解决建议
1. 验证Azure区域与Teams租户区域一致性
新版Teams对跨区域调用的权限校验更严格,确保Bot部署的Azure App Service区域与Teams租户的主区域一致,避免跨区域请求被拦截。
2. 确认Bot的应用权限配置
- 检查Microsoft Entra ID中Bot注册的应用是否已添加
Channel.ReadBasic.All应用权限,并完成管理员同意操作。新版Teams可能强化了权限校验,此前的隐式权限不再生效。 - 确保权限类型为应用权限而非委派权限,Bot后台调用需要应用级权限支撑。
3. 检查Azure App Service出站网络规则
若App Service配置了虚拟网络集成或防火墙,需确保允许访问以下Teams相关API端点:
https://graph.microsoft.comhttps://smba.trafficmanager.net
新版Teams的API端点可能有调整,旧规则可能未覆盖新的访问路径。
4. 升级Bot Framework SDK版本
2024年4月微软可能对Teams API做了兼容性更新,旧版SDK可能存在适配问题。升级到最新稳定版的Microsoft.Bot.Builder.Teams和Microsoft.Bot.Connector.Teams NuGet包,确保SDK能匹配新版Teams的权限校验逻辑。
5. 核对Teams应用清单权限声明
检查Teams应用清单(manifest.json)中是否正确声明了Channel.ReadBasic.All权限,新版Teams要求清单权限与Entra ID应用权限严格匹配,否则会拦截请求。
6. 对比本地与生产环境的请求差异
启用Bot的调试日志,对比本地ngrok和Azure App Service环境下的请求头、身份令牌差异:
- 检查令牌中的权限范围(scp/roles)是否包含
Channel.ReadBasic.All - 确认令牌的受众(aud)是否指向正确的Teams API端点
新版Teams可能采用了不同的身份验证流程,生产环境需严格遵循规范。
内容的提问来源于stack exchange,提问作者Swapnil Chowkekar
相关产品推荐
相关产品推荐

