开启MFA的Outlook Office 365,如何用用户名和应用密码通过API获取Access Token?
问题分析与解决方案
你遇到的AADSTS50126错误核心原因及解决方法如下:
"error": "invalid_grant", "error_description": "AADSTS50126: Error validating credentials due to invalid username or password.", "error_codes": [50126]
为什么应用密码无法使用?
OAuth2的password授权类型不支持启用MFA用户的应用密码。应用密码是微软为兼容旧版基础认证(比如直接用IMAP/POP输入密码)设计的,本质是绕开MFA的特殊凭证,但它和OAuth2的认证体系不兼容——password flow要求输入用户的真实账户密码,而启用MFA后,单纯的密码验证会触发二次验证,password flow本身无法处理MFA步骤,因此直接返回凭证无效的错误。
权限配置说明
你当前配置的「IMAP access for ALL」(对应Exchange Online的IMAP.AccessAsUser.All委派权限)已经满足IMAP访问的需求,不需要额外添加其他委派API权限。但要确认两点:
- 该权限为委派权限(而非应用权限)
- 已完成权限同意(管理员全局同意或用户个人同意,取决于租户设置)
正确解决步骤
要支持MFA用户的IMAP OAuth2访问,必须放弃password授权类型,改用支持MFA的授权流程:
1. 授权码流(Authorization Code Flow)
适合有前端交互的场景:
- 引导用户跳转至Azure AD登录页,完成MFA验证
- 获取授权码后,用授权码兑换Access Token
- 所需Scope:
https://outlook.office365.com/IMAP.AccessAsUser.All offline_access(添加offline_access可获取Refresh Token,后续无需重复登录)
2. 设备码流(Device Code Flow)
适合无前端的终端/服务场景:
- 应用向Azure AD请求设备码,得到一个验证URL和验证码
- 用户通过浏览器访问该URL,输入验证码并完成MFA验证
- 应用轮询Azure AD获取Access Token
- 需确保Azure AD应用注册中开启了「公共客户端」身份(在「身份验证」设置中配置),Scope与上述一致
额外提醒
- 微软已逐步淘汰
password授权类型,尤其是针对MFA用户,后续可能完全禁用,建议尽快切换到合规的授权流程 - 不要尝试绕开MFA验证使用
passwordflow,这不符合微软安全规范,也会带来数据风险
内容的提问来源于stack exchange,提问作者DarkRose
相关产品推荐
相关产品推荐

