已配置TeamsActivity.Send权限仍提示请求缺少角色权限求助
问题排查与解决方法
错误原因
- 你使用的客户端凭据(client_credentials)授权流,和配置的委托权限TeamsActivity.Send不兼容。客户端凭据流是应用以自身身份调用API,仅支持应用权限;而委托权限是代表用户调用API,必须搭配需要用户登录的授权流(比如授权码流)。
- 用client_credentials流请求令牌时,指定
scope=https://graph.microsoft.com/.default,只会返回包含应用权限的令牌,不会带上你配置的委托权限,所以令牌里没有TeamsActivity.Send权限,调用API自然触发权限缺失错误。
解决方法
方案一:改用授权码流获取令牌(适合代表用户发送通知的场景)
- 先确认Azure AD应用中的TeamsActivity.Send委托权限已经完成管理员同意(部分企业租户要求管理员统一授权,个人租户可能用户自行授权即可)。
- 切换到授权码授权流程:
- 引导用户访问授权端点,参数包含
client_id、redirect_uri、scope=https://graph.microsoft.com/TeamsActivity.Send、response_type=code。 - 用户登录并授权后,拿到授权码,再调用令牌端点,使用
grant_type=authorization_code,搭配code、client_id、client_secret、redirect_uri参数获取令牌。 - 用这个令牌调用
https://graph.microsoft.com/v1.0/users/{userId}/teamwork/sendActivityNotification接口即可。
- 引导用户访问授权端点,参数包含
方案二:改用应用权限(适合应用以自身身份发送通知的场景)
- 该接口支持应用权限TeamsActivity.Send.All,先在Azure AD应用注册中添加这个应用权限。
- 对该应用权限完成管理员同意。
- 继续使用client_credentials流获取令牌,此时令牌里会包含TeamsActivity.Send.All权限,调用接口就能正常执行。
验证技巧
获取令牌后,可以用jwt.ms解析令牌,查看scp(委托权限)或roles(应用权限)字段,确认是否包含对应的权限,快速排查令牌是否正确。
内容的提问来源于stack exchange,提问作者hello12345
相关产品推荐
相关产品推荐

