Azure AD多租户应用个人Outlook账号获取SMTP令牌报invalid_scope错误
解决个人Outlook账号获取SMTP.Send令牌时的invalid_scope错误
问题核心在于你使用的https://outlook.office365.com/SMTP.Send作用域仅支持工作/学校类型的组织邮箱,个人Microsoft账户(Outlook.com)并不支持该单独作用域,因此会抛出invalid_scope错误。以下是具体解决方法:
1. 针对不同账户类型使用对应作用域
- 组织邮箱(工作/学校账户):继续使用
https://outlook.office365.com/SMTP.Send作用域 - 个人Outlook账户:替换为
https://outlook.office365.com/.default作用域(个人账户无法单独申请SMTP.Send权限,需使用默认全作用域集合)
2. 修改代码适配双账户类型
你可以通过捕获invalid_scope异常,或者判断账户的租户ID来切换作用域。以下是优化后的代码示例:
var tenantId = "d0748657........"; var clientId = "23a9c7a6........"; var authorityUri = $"https://login.microsoftonline.com/common"; var redirectUri = "http://localhost"; var pca = PublicClientApplicationBuilder .Create(clientId) .WithAuthority(new Uri(authorityUri)) .WithRedirectUri(redirectUri) .Build(); AuthenticationResult result = null; var accounts = await pca.GetAccountsAsync(); if (accounts.Any()) { var account = accounts.FirstOrDefault(); var scopes = account.TenantId == "9188040d-6c67-4c5b-b112-36a304b66dad" ? new[] { "https://outlook.office365.com/.default" } : new[] { "https://outlook.office365.com/SMTP.Send" }; result = await pca.AcquireTokenSilent(scopes, account).ExecuteAsync(); } else { try { // 先尝试组织邮箱作用域,失败则切换为个人账户作用域 result = await pca.AcquireTokenInteractive(new[] { "https://outlook.office365.com/SMTP.Send" }).ExecuteAsync(); } catch (MsalServiceException ex) when (ex.ErrorCode == "invalid_scope") { result = await pca.AcquireTokenInteractive(new[] { "https://outlook.office365.com/.default" }).ExecuteAsync(); } catch (MsalException ex) { Console.WriteLine($"Error acquiring access token: {ex}"); } } if (result != null) { Console.WriteLine($"Token : {result.AccessToken}"); }
3. 确认应用权限配置
在Azure AD应用注册中,确保已添加对应权限:
- 对于组织账户:添加Office 365 Exchange Online下的
SMTP.Send委托权限,并完成管理员同意 - 对于个人账户:添加Office 365 Exchange Online下的
Exchange.Send委托权限,个人用户登录时会自动完成权限同意
内容的提问来源于stack exchange,提问作者It's Siddiqi
相关产品推荐
相关产品推荐

