解决 VS Code 微软账户频繁掉线、反复要求重新登录的问题

解决 VS Code 微软账户频繁掉线、反复要求重新登录的问题

最近遇到一个比较烦的问题:VS Code 中的 Microsoft 微软账户总是频繁掉线,需要重新登录

有时候刚完成登录,没过多久 VS Code 又提示账户失效,需要重新认证。奇怪的是,同一个 VS Code 中的 GitHub 账户却一直非常稳定

最终排查发现,问题大概率出在 VS Code 的 Microsoft Authentication 原生认证 Broker 上。

问题原因

VS Code 中的 GitHub 登录和 Microsoft 登录实际上是两套完全独立的认证机制。

Microsoft Authentication 在 Windows 上默认使用:

VS Code
  ↓
Microsoft Authentication
  ↓
MSAL
  ↓
Windows Native Broker / WAM
  ↓
Windows 微软账户认证体系

其中 WAM(Windows Web Account Manager)是 Windows 自己的微软账户认证组件。

Windows 中的 Office、OneDrive、Outlook、Azure、工作或学校账户等,都可能共享或参与这套认证体系。

如果 WAM 中存在旧账户、失效 Token,或者 VS Code 的 Broker 登录流程本身出现异常,就可能出现:

  • 登录成功后很快又掉线
  • VS Code 反复要求重新登录
  • 登录窗口循环出现
  • 明明认证成功,但 VS Code 获取不到 Session
  • Microsoft 账户异常,但 GitHub 账户完全正常

VS Code 官方仓库目前也存在相关问题。

例如 Issue #299599 中描述的问题就是:启用 MSAL Native Broker 后,Microsoft 登录成功但 Session 随后丢失,导致不断重新要求认证。

相关 Issue:

VS Code 本身也明确提供了 msal-no-broker 这个认证模式。

解决方法

目前最简单的解决方案就是:

让 VS Code 不再使用系统的 Native Broker / WAM,而是由 MSAL 自己维护登录状态。

打开 VS Code:

Ctrl + Shift + P

执行:

Preferences: Open User Settings (JSON)

settings.json 中加入:

{
    "microsoft-authentication.implementation": "msal-no-broker"
}

如果本来已经存在其他配置,只需要增加这一项即可:

"microsoft-authentication.implementation": "msal-no-broker"

然后:

  1. 完全退出 VS Code
  2. 重新打开 VS Code
  3. 重新登录 Microsoft 账户

配置完成后,认证流程会变成:

VS Code
  ↓
Microsoft Authentication
  ↓
MSAL
  ↓
直接进行 OAuth 认证

不再通过 Windows WAM Native Broker。

VS Code 官方相关 Issue 中也明确将这个配置作为绕过 Broker 登录问题的 Workaround。

这个设置有什么副作用?

主要影响是失去 Windows 原生账户 Broker 带来的部分能力,例如:

  • Windows 系统级 SSO
  • 原生微软账户选择窗口
  • 与 Windows 中其他微软应用共享部分认证状态

但对于普通 VS Code 使用来说影响通常不大。

反而如果当前 WAM / Broker 本身就是造成频繁掉线的原因,关闭 Broker 后登录状态通常会更加稳定。

如果修改后还是频繁掉线

可以打开:

Ctrl + Shift + U

进入 VS Code 的 Output / 输出,选择:

Microsoft Authentication

观察掉线时的日志。

如果出现类似:

getSessions returned 0 session(s)

或者 Broker、Account、Token、MSAL 相关错误,就可以进一步判断到底是:

  • Native Broker 问题
  • Token 缓存异常
  • Microsoft Entra / 企业账户策略
  • Conditional Access
  • 网络导致 Token Refresh 失败

不过对于普通 Windows 用户,如果表现为 GitHub 登录一直正常,唯独 Microsoft 登录反复掉线,优先尝试:

"microsoft-authentication.implementation": "msal-no-broker"

通常是成本最低、最直接的解决办法。

注意:如果使用的是 Azure China、US Government 等 Sovereign Cloud 环境,msal-no-broker 本身也存在单独的 Token 持久化问题,不建议直接套用这个方案。相关问题见 microsoft/vscode#307340

评论