使用EWS与OAuth读取邮箱时遭遇403 Forbidden错误求助
EWS新式身份认证返回403 Forbidden问题排查
问题描述
微软弃用EWS基本身份认证后,更新应用支持新式身份认证,但调用EWS接口始终返回403 Forbidden错误。相关代码及权限配置如下:
代码实现
var cca = ConfidentialClientApplicationBuilder .Create("AppId") .WithClientSecret("ClientSecret") .WithTenantId("TenantId") .Build(); var ewsScopes = new string[] { "https://outlook.office365.com/.default" }; var emailToBeRead = "test@test.com"; try { var authResult = cca.AcquireTokenForClient(ewsScopes) .ExecuteAsync().Result; // Configure the ExchangeService with the access token var ewsClient = new ExchangeService { Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx"), Credentials = new OAuthCredentials(authResult.AccessToken), ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, emailToBeRead) }; //Include x-anchormailbox header ewsClient.HttpHeaders.Add("X-AnchorMailbox", emailToBeRead); // Make an EWS call var folders = ewsClient.FindFolders(WellKnownFolderName.MsgFolderRoot, new FolderView(10)); foreach (var folder in folders) { Console.WriteLine($"Folder: {folder.DisplayName}"); } } catch (MsalException ex) { Console.WriteLine($"Error acquiring access token: {ex}"); } catch (Exception ex) { Console.WriteLine($"Error: {ex}"); }
权限配置

排查与解决步骤
确认权限已获得管理员同意:截图中配置的
EWS.AccessAsApp是应用权限,必须由全局管理员在Azure AD中授予管理员同意。进入Azure AD应用注册→权限配置页,检查该权限的状态是否为“已授予[租户名]的管理员同意”,未同意的话点击“授予管理员同意”按钮完成授权。在Exchange Online中配置应用访问策略:仅在Azure AD中添加权限不够,还需通过PowerShell为应用分配目标邮箱的访问权限:
# 连接Exchange Online PowerShell Connect-ExchangeOnline # 允许应用访问指定邮箱 New-ApplicationAccessPolicy -AppId <你的应用AppId> -PolicyScopeGroupId test@test.com -AccessRight AllowAccess -Description "允许应用访问test@test.com邮箱"若需访问多个邮箱,可创建安全组并添加目标邮箱,将
PolicyScopeGroupId替换为安全组的邮箱地址或对象ID。调整代码中的身份认证配置:使用
EWS.AccessAsApp应用权限时,无需设置ImpersonatedUserId(该属性用于用户权限下的模拟场景),可移除代码中ImpersonatedUserId的赋值,保留X-AnchorMailbox头即可。验证访问令牌的有效性:将获取到的access token复制到jwt.ms解析,检查
roles字段是否包含EWS.AccessAsApp。若不存在,说明权限未正确同步,需重新授予管理员同意或等待权限生效。检查租户全局应用访问策略:确认租户未配置全局阻止应用访问邮箱的策略,可通过以下命令查看:
Get-ApplicationAccessPolicy若存在限制策略,需调整策略确保目标邮箱或应用在允许范围内。
内容的提问来源于stack exchange,提问作者wegelagerer
相关产品推荐
相关产品推荐

