Azure租户管理员无法通过MS Graph应用权限读取Outlook邮箱
问题概述
我需要创建一个可读取Azure租户内任意收件箱的应用,相关信息如下:
- 注册Azure的账户需可被该应用访问
- 我的Outlook账户是Azure租户管理员账户,且为Office 365个人版账户
我已在Azure中创建应用并配置了MS Graph应用权限:
Mail.ReadUser.Read.All
且已完成管理员同意授权。
目前能成功列出租户内用户(列表仅显示我的账户),但尝试访问该账户的邮件文件夹时失败,代码及报错如下:
var scopes = new List<string> { "https://graph.microsoft.com/.default" }; var clientCredential = new ClientSecretCredential(Secrets.TenantId, Secrets.ClientId, Secrets.ClientSecret); var graph = new GraphServiceClient(clientCredential, scopes); try { var users = await graph.Users.GetAsync(); Console.WriteLine(users.Value.Count); // => 1 // UserId == Azure User Object Id // var mailbox = await graph.Users[Secrets.UserId].MailFolders.GetAsync(); // => ResourceNotFound // UserEmail == My Outlook Account that created the Azure Tenant so the Admin of the Tenant // var mailbox = await graph.Users[Secrets.UserEmail].MailFolders.GetAsync(); // => ErrorInvalidUser // UserPrincipalName = {alias}@{my-outlook-account}.onmicrosoft.com // var mailbox = await graph.Users[Secrets.UserPrincipalName].MailFolders.GetAsync(); // => ResourceNotFound // UserIssuer = {my-outlook-account}.onmicrosoft.com // var mailbox = await graph.Users[Secrets.UserIssuer].MailFolders.GetAsync(); // => ResourceNotFound if (users != null && users.Value != null && users.Value.Any()) { var json = JsonSerializer.Serialize(users.Value, new JsonSerializerOptions { WriteIndented = true }); Console.WriteLine(json); // Show my user foreach (var user in users.Value) { var mailfolders = user.MailFolders.ToList(); // Throw because => MailFolders is null Console.WriteLine(mailfolders.Count); } } } catch (ODataError error) { Console.WriteLine(error.Error.Code); Console.WriteLine(error.Error.Message); throw; }
问题原因
你的Office 365个人版Outlook账户属于消费者邮箱服务(Outlook.com),而非Azure租户绑定的Exchange Online商业/教育版邮箱。MS Graph的Mail.Read应用权限仅对Exchange Online的工作/学校账户生效,无法访问消费者邮箱资源。同时,该账户在Azure租户中仅作为管理员身份存在,但没有对应的Exchange邮箱实例,因此调用邮件相关接口时会返回资源不存在或用户无效的错误。
解决方案
方案1:使用Exchange Online授权的工作/学校账户
如果要实现读取Azure租户内任意收件箱的需求,需要使用属于该租户的Office 365商业版/教育版账户(即工作/学校邮箱)。这类账户在租户内拥有对应的Exchange Online邮箱资源,配置Mail.Read应用权限并完成管理员同意后,即可通过应用权限模式正常访问其邮件文件夹。
方案2:访问个人版Outlook邮箱(需切换权限模式)
如果必须访问个人版Outlook邮箱,需放弃应用权限模式,改用委托权限模式:
- 在Azure应用中添加
Mail.Read委托权限,并完成管理员同意(或用户授权) - 修改代码使用授权码流程或交互式登录流程,例如改用
InteractiveBrowserCredential或AuthorizationCodeCredential,作用域替换为new List<string> { "Mail.Read" },而非.default - 运行代码时,需要个人版Outlook账户手动登录授权,应用才能获取访问邮箱的权限
内容的提问来源于stack exchange,提问作者Vince
相关产品推荐
相关产品推荐

