我正在尝试从租户中的Microsoft Teams获取所有消息,我已将应用程序注册到Azure,设置了正确的权限并磨碎了管理员特权。
让我感到困惑的是创建GraphServiceClient。 我的应用程序更像是守护程序应用程序。 如果有人能给我一个如何正确创建客户端的示例,我将不胜感激。
到目前为止,这是我的代码:
string[] graphScopes = { "https://graph.microsoft.com/.default" };
IConfidentialClientApplication app = ConfidentialClientApplicationBuilder
.Create("x")
.WithTenantId("x")
.WithClientSecret("x")
.Build();
ClientCredentialProvider authProvider = new ClientCredentialProvider(app);
GraphServiceClient graphClient = new GraphServiceClient(authProvider);
try
{
var messages = await graphClient.Teams["x"].Channels["x@thread.skype"].Messages.Request().GetAsync();
Console.ReadLine();
foreach(var item in messages)
{
Console.WriteLine(item.Body);
}
}
catch(Exception e)
{
Console.WriteLine(e.Message);
Console.Read();
}
无论我尝试得到什么,我都会遇到以下错误 代码:UnknownError内部错误:AdditionalData:请求ID:x日期:2020-05-27T14:22:37 ClientRequestId:x
更新:我可以从API中获得某些东西,我的权限错误。 仍然无法收到消息, 我拥有所有这些许可: ChannelMessage.Read.All,Group.Read.All,Group.ReadWrite.All 我可能缺少“ ChannelMessage.Read.Group(RSC)”权限,但在权限页面中找不到它。
答案 0 :(得分:0)
您的问题是您正在访问"beta" api,但使用的是生产基础URL路径。
您需要的许可是以下任意一项(即是否许可):
- ChannelMessage.Read.Group(RSC)或
- ChannelMessage.Read.All或
- Group.Read.All或
- Group.ReadWrite.All
由于您拥有Group.Read.All,因此您只需拥有权限即可。
您需要做的是将基本URL更改为beta API:
graphClient.BaseUrl = "https://graph.microsoft.com/beta";
已更新:
由于您现在说的是“禁止”错误,因此我认为您也有同意问题。
我的猜测是您在一个租户上创建并同意了您的应用,但您正在尝试访问另一个租户中的数据。这将为您提供禁止的错误。也就是说,您创建并同意了一个dev azure帐户租户,并正在尝试访问您的工作租户。
如果是这种情况,您需要: *确保将您的天蓝色应用设置为multi-tenanted *您必须由目标租户获得您的应用consented
如果您这样做并使用beta端点,我希望您的示例代码将开始工作。
Update2:
最后,我尝试使用上面的应用程序上下文来处理消息列表,并且我从beta api中也遇到了相同的Forbidden错误。从用户上下文来看,它工作正常。因此,您的答案将是使用用户上下文而非应用程序上下文来访问此API。
看起来您击中的是Protected API。因此,如果您想从应用程序上下文中使用此API,则必须提交请求以允许对其进行访问。
答案 1 :(得分:0)
也许这是解决方案或问题;-)
Microsoft Graph 中访问敏感数据的 Microsoft Teams API 被视为受保护的 API。这些 API 要求您在使用之前进行额外的验证,超出许可和同意的范围。