c# - 从机器人代码调用 MS Teams Graph API 导致 403 Request Forbidden
问题描述
我有一个添加了 Cortana 频道的机器人。我已配置 Cortana 连接帐户以获取 Graph API 的访问令牌。我的机器人代码正在使用这个令牌来调用 MS Teams API。
Cortana 正确调用我的技能机器人并提示用户登录。成功登录后,我已在代码中验证我正在获取访问令牌。使用此令牌,当我的机器人代码调用 时https://graph.microsoft.com/v1.0/me/joinedTeams
,我得到响应:
{
StatusCode: 403,
ReasonPhrase: 'Forbidden',
Version: 1.1,
Content: System.Net.Http.StreamContent,
Headers: {
Transfer-Encoding: chunked
request-id: b1f83dda-1ce4-4660-9950-d890123f5b27
client-request-id: b1f83dda-1ce4-4660-9950-d890123f5b27
x-ms-ags-diagnostic: {
"ServerInfo":{
"DataCenter":"West US",
"Slice":"SliceC",
"Ring":"5",
"ScaleUnit":"003",
"Host":"AGSFE_IN_4",
"ADSiteName":"WUS"
}
}
Duration: 43.0296
Strict-Transport-Security: max-age=31536000
Cache-Control: private
Date: Wed, 23 Jan 2019 20:13:33 GMT
Content-Type: application/json
}
}
我在 Cortana 通道 Oauth 设置范围内以及 Azure 门户中的应用内设置了以下权限:
Mail.Read
Mail.Send
openid
profile
User.Read
User.ReadBasic.All
User.Read.All
User.ReadWrite.All
Group.Read.All
Group.ReadWrite.All
(委托+申请)
通过具有相同登录凭据的图形资源管理器进行的相同调用会返回我加入的团队的列表。
我在这里想念什么?我该如何进一步调试?
解决方案
在您可以使用某些权限范围之前,您需要先获得“管理员同意”。请注意,这是与“用户同意”不同的过程。管理员同意在用户同意之前,并且实际上是管理员说“当然,我的租户中的用户可以接受您的应用程序要求的范围”。您可能会发现这篇关于理解用户同意和管理员同意之间区别的文章很有帮助。
您如何执行 Admin Consent 取决于您的应用程序。如果您是一个多租户应用程序(即您的应用程序被不同的组织使用),那么您需要向每个租户的管理员提供一个特定的 URI 以启动该过程。对于此过程,我建议您查看为您的应用程序获取行政同意书。
如果您是单租户应用程序(即内部企业应用程序),那么事情会简单一些。租户管理员只需在Azure 门户中的应用程序注册页面中单击“授予同意”选项(位于应用程序的“API 权限”页面上)。
推荐阅读
- javascript - 悬停时不显示下拉菜单
- kubernetes - AWS 上的 Istio 是否需要 AWS ALB?
- emacs - Emacs describe-key 期望输入什么?
- python - 从 django 中的请求中检索列表
- python - 比赛选择 平均体能没有增加?
- actionscript-3 - 如何从 adobe animate 应用程序在本地计算机上执行 .bat 文件?
- spring - Spring @Transactional 和回滚不起作用,弹簧集成测试
- bash - BASH 条件 if 语句 AND 两个输出真或假的命令
- arrays - 在 BASH 中将项目添加到数组中
- reactjs - How to create a condition depending on the route one is in?