管理员删除首选项中的双因素密钥后被锁定在站点之外

复现步骤

  1. 在已更新到最新版本的 Discourse 站点上担任管理员,并启用了一个或多个双因素认证密钥(如安全密钥和身份验证器应用)。
  2. 能够使用这些双因素密钥成功登录和退出。
  3. 确保站点设置中强制要求双因素登录的选项设置为“否”。
  4. 使用管理员用户个人资料偏好设置中“安全”选项卡内的标准 UI 工具,删除您(管理员)账户中的所有双因素项目。
  5. 退出登录。

预期行为

  1. 使用用户名或密码登录站点;访问被允许;或
  2. 使用“通过电子邮件发送链接”功能登录站点;访问被允许。

实际行为

上述两种“预期”场景均因错误消息而失败,且不允许登录:

所选的双因素认证方法未为您的账户启用。

此时,管理员账户无法再通过任何其他方式登录。


值得注意的是,我实际上并未被完全锁定在该站点之外;我在另一台计算机上仍有一个活跃的会话,因此能够切换到该会话并重新添加基于令牌的身份验证器以恢复访问。但假如我没有其他活跃会话,我本会“完全”被锁定在外。

10 个赞

感谢报告。我这几天一直把它加入书签,但还没腾出时间测试。我推测您报告的情况是正确的,但会在下周仔细查看。

4 个赞

我想这就是那个漏洞吧?如果您的站点设置规定所有管理员必须启用双因素认证,那么就不应该允许这样做。

我认为您并没有完全被锁定,现在可以通过控制台进行恢复,但我们不应让您轻易制造出这种极端情况。

我不太确定这是否是正确的逻辑?我并没有在除默认值“否”之外的任何地方启用强制第二因素,而且假设每个安装实例都有多个管理员账户并不安全。看起来,一旦从个人资料中删除了 2FA 密钥,某个地方的其他标志并未被清除……

我认为你并没有完全被锁定,现在可以使用控制台进行恢复。

这确实是一个有效的应急变通方案,尽管这可能超出了那些不管理自己服务器的管理员的能力范围,他们可能不得不去寻找系统管理员帮忙。

4 个赞

我想知道恢复代码是否未被改动。你能试着输入其中一个吗?

1 个赞

@Osama 在您处理代码时,也许可以:

  • 如果用户在删除此 2FA 后将不允许再次登录(这是他们最后一个 2FA,并且根据信任级别设置/管理员设置,2FA 对帐户是必需的)

  • 那么不要允许他们删除最后一个 2FA 并显示错误。

1 个赞

我似乎遇到了同样的问题(Discourse 版本 2.7.10,今天已升级)。

我被授予了管理员权限,并启用了双因素认证 (2FA)。之后,我从另一个电子邮件地址为自己创建了一个第二个用户,专门用于管理员,并授予该用户管理员权限。然后,我从我的原始用户那里移除了管理员权限,并删除了所有双因素认证 (2FA) 方法。现在我的原始用户遇到了 OP 所提到的错误行为。我无法访问此服务器的控制台。该网站并未强制管理员启用双因素认证 (2FA)。

请有人详细说明在控制台需要执行哪些操作才能解决此问题。

顺便说一下,我这样做的原因是我希望通过我的普通用户受到网站上私人群组的正常权限和通知(或不通知)的约束,也许还可以启用邮件列表模式。作为普通用户,我不需要双因素认证 (2FA) 带来的额外麻烦。

当然,管理员用户可以看到所有内容,因此这取决于他们不进行不必要窥探的信任。该用户可以关闭所有通知,并且不启用邮件列表模式。

1 个赞

我认为你没有机会使用恢复代码,因为它们只能通过 2fa 登录流程使用?

@sam 你若有所指地说这个问题可以通过控制台解决,但却没有说具体需要做什么。我非常希望能得到关于如何解决这个特定问题的提示。

这有帮助吗?

2 个赞

我怀疑不是这样,因为该帐户已经禁用了双重身份验证,或者更确切地说,已经从其帐户中删除了所有双重身份验证方法(双重身份验证在个人资料中显示为“否”),但登录仍尝试使用双重身份验证。
该指南适用于已启用双重身份验证但丢失/忘记了生成有效令牌的方法的用户。

解决方案:作为管理员用户,请访问被锁定用户的详细信息页面,滚动到页面底部,然后点击红色的“模拟”按钮。
然后,在用户偏好设置中,添加一个 2FA 方法。(需要用户的密码才能执行此操作)
2FA 密钥必须提供给被锁定用户。
在这种情况下,我既是管理员也是用户,所以这并不是一件难事 :wink:

1 个赞

干得好。:+1::slightly_smiling_face:

之后您是否成功移除了用户的双重身份验证?

不。移除双重身份验证方法再次将用户锁定。

按下“全部禁用”按钮移除双重身份验证 (2FA) 的行为是否与移除最后一个双重身份验证 (2FA) 方法不同?也就是说,按下该按钮是否会在不锁定您的账户的情况下将其移除?

我已成功复现此问题,并找到了使用控制台的解决方案。

复现步骤与首帖描述略有不同。步骤 2 至关重要,步骤 3 和 4 相对不那么重要。

  1. 在一个已启用一个或多个双重身份验证密钥(如安全密钥和身份验证器应用)的最新 Discourse 网站上,成为一名用户(管理员)。
  2. 启用备份代码
  3. 能够使用这些双重身份验证密钥成功登录和退出
  4. 确保强制双重身份验证登录的网站设置为“否”
  5. 使用管理员用户配置文件首选项的安全选项卡中的标准 UI 工具,删除您~~(管理员)~~帐户中的所有双重身份验证项目(身份验证器和安全密钥)。
  6. 退出登录。

发生的情况是,如果删除了所有双重身份验证项目,备份代码仍然存在于数据库中,并且在登录时双重身份验证并未被视为已禁用。

由于不再有身份验证器或安全密钥,用户无法使用备份代码。

一旦删除了所有身份验证器和密钥,甚至无法在配置文件 - 安全中删除备份代码。

建议修复:当用户的所有安全项目被删除时,备份代码也应一并删除。

解决方法:从数据库中删除此用户的所有 UserSecondFactor 记录。

UserSecondFactor.where(user_id: 1).delete_all

12 个赞

在 Discourse 的新版本中是否有可能实现此修复?我今天也遇到了完全相同的情况,找回我的帐户非常麻烦。

1 个赞

我遇到了一个用户抱怨无法登录的同样问题。该用户曾经在其账户上启用了 2FA,但后来将其移除。他们登录时收到的错误消息是:

您账户未启用所选的双因素验证方法。

所选的双因素验证方法无效。

…并且电子邮件未被更改/添加。

  • 我无法访问此 Discord 安装的控制台或数据库,因为它是由“托管”的。

我还有什么可以尝试的吗?或者用户将永远被锁定在他们的账户之外?

这太糟糕了。

我无法访问 discourse 控制台,因为这是一个“托管”的 discourse 实例。

管理员应该能够在管理界面中清除 2FA 工厂,要求我们的用户提供密码是极不专业的。

这显然是一个需要解决的重大错误。我们如何正式报告此问题并跟踪其错误修复进度?

作为一个拥有托管 discourse 实例的开源项目,我无法访问控制台或数据库,我只有管理界面。

实际上我不同意。禁用 2FA 时,2FA 备份代码应完全被忽略,根本不重要。

通过在错误的地方修复此问题(删除最后一个 2FA 方法时,删除备份代码),我们仍然会有人无法登录,并且只是放弃而没有报告。

通过修复实际错误(在禁用 2FA 时考虑备份代码),我们可以立即为 100% 受影响的用户解决此问题,而不是仅仅确保新用户不会持续遇到此问题。

对我来说很有效,用户给了我密码。

不能直接禁用 2FA,你必须先:

  • 删除所有 2FA 备份代码
  • 三重检查所有 2FA 备份代码是否已删除
  • 仅在此之后禁用 2FA

使用此方法,你实际上能够禁用 2FA。这对于模拟用户来修复此问题的管理员用户来说是真实的,但对于想要禁用 2FA 的任何普通用户来说也是真实的。