asp.net 如何获取整个组织的Graph API访问令牌和传入邮件的读取计数?

fkaflof6  于 2023-04-08  发布在  .NET
关注(0)|答案(1)|浏览(152)

我试图读取组织中的传入邮件计数和其中的用户。我在控制台应用程序中尝试了下面的代码。但在这一行-**var users = await graphServiceClient.Users.Request().GetAsync();**应用程序停止运行。
1.那么,为什么会发生这种情况?(我尝试与调试器,但没有错误)
1..WithAuthority的格式是否正确?
1.是否有任何替代方法来访问图形API令牌和读取所有组织中的传入邮件计数?如果有,请帮助我提供示例代码。

var confidentialClient = ConfidentialClientApplicationBuilder.Create(clientId).WithAuthority($"https://login.microsoftonline.com/$token/v2.0").WithClientSecret(clientSecret).Build();

 GraphServiceClient graphServiceClient =
 new GraphServiceClient(new DelegateAuthenticationProvider(async (requestMessage) => {

 var authResult = await confidentialClient.AcquireTokenForClient(scopes).ExecuteAsync();

requestMessage.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", authResult.AccessToken);}));

 var users = await graphServiceClient.Users.Request().GetAsync();

foreach (Microsoft.Graph.User item in users)
{

Console.WriteLine(item.DisplayName);
}

Console.WriteLine(users.Count);

谢谢!

tkqqtvp1

tkqqtvp11#

在Ms graph API中,我们没有一个API可以查询整个组织中的所有邮件,我们只有一个list message API可以获取特定用户的邮件。而组织中的某个用户想要获取其他用户的邮件,我们通常需要有应用API权限,文档中提到:
在两种情况下,应用可以获取其他用户邮件文件夹中的邮件:
如果应用程序具有应用程序权限,或者,如果应用程序具有来自一个用户的适当委派权限,而另一个用户已与该用户共享邮件文件夹,或者,已向该用户授予委派访问权限。请参阅详细信息和示例。
关于应用程序API权限,它是两种权限中的一种,委托API权限是指用户需要登录才能获得授权,授权允许用户访问自己的资源;应用程序API权限是指应用程序请求授权,该授权允许应用程序访问租户中所有用户的所有资源。
对于此API,我们需要具有Mail.ReadBasic.All, Mail.Read, Mail.ReadWrite应用程序接口权限。

然后我们可以使用代码(基于最新的graph SDK)来获取特定用户的电子邮件计数:

using Microsoft.Graph;
using Azure.Identity;

var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "tenant_name.onmicrosoft.com";
var clientId = "aad_app_id";
var clientSecret = "client_secret";
var clientSecretCredential = new ClientSecretCredential(
                tenantId, clientId, clientSecret);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);

var result = await graphClient.Users["{user-id}"].Messages.GetAsync((requestConfiguration) =>
{
    requestConfiguration.QueryParameters.Count = true;
});

然后使用循环添加总消息计数。顺便说一下,graphServiceClient.Users.Request().GetAsync();将返回租户中的所有用户,但我认为不是每个用户都有邮件许可证。
Ms Graph API只能访问租户中的资源,例如,您邀请我的帐户进入您的租户,而我的帐户是我的outlook电子邮件(tiny@outlook.com),我在此电子邮件地址中有许多电子邮件,但您无法通过API获取任何电子邮件信息。
因为当你邀请我的账号进入你的租户时,我的账号会有一个类似tiny_outlook.com#EXT#@yourTenantName.onmicrosoft.com的原则,你还需要添加一个license(例如M365 E3 license会给予email功能),然后API可以查询到该原则的email,如果您没有分配这种license,这个原则不会有一个电子邮件地址,所以不会有任何电子邮件为这个原则。

相关问题