我有一个添加了 Cortana channel 的机器人。我已配置 Cortana 连接帐户以获取 Graph API 的访问 token 。我的机器人代码使用此 token 来调用 MS Teams API。
Cortana 正确调用我的技能机器人并提示用户登录。成功登录后,我已在代码中验证我正在获取访问 token 。使用此 token ,当我的机器人代码调用 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 channel Oauth 设置范围以及 Azure 门户中的应用内设置了以下权限:
Mail.Read
邮件发送
openid
个人资料
用户.Read
User.ReadBasic.All
用户.Read.All
User.ReadWrite.All
Group.Read.All
Group.ReadWrite.All
(委托(delegate) + 应用程序)
使用相同的登录凭据通过图形浏览器进行相同的调用会返回我加入的团队的列表。
我在这里缺少什么?我该如何进一步调试?
最佳答案
在使用某些权限范围之前,您需要先获得“管理员同意”。请注意,这是一个与“用户同意”不同的过程。管理员同意先于用户同意,并且实际上是管理员说“当然,我的租户中的用户可以接受您的应用程序要求的范围”。您可以在 understanding the difference between User and Admin Consent 上找到这篇文章有帮助。
如何执行管理员同意在一定程度上取决于您的应用程序。如果您是 Multi-Tenancy 应用程序(即您的应用程序被不同组织使用),那么您需要向每个租户的管理员提供特定的 URI 来启动该流程。对于这个过程,我建议看一下 Obtaining Administrative Consent for your application .
如果您是单租户应用程序(即内部企业应用程序),那么事情会更简单一些。租户管理员只需从Azure portal中的申请注册页面单击“授予同意”选项即可。 (可以在您的应用程序的“API 权限”页面上找到)。
关于c# - 从机器人代码调用 MS Teams Graph API 会导致 403 请求被禁止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54335179/