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

Steps to reproduce

  1. Be an admin on an up-to-date Discourse site with one or more two-factor keys enabled, such as security keys and authenticator app.
  2. Be able to log in and out successfully with those two-factor keys.
  3. Ensure that the site setting for enforcing two-factor logins is set to “no”.
  4. Delete all of the two-factor items from your (admin) account using the standard UI tools in the Security tab of the admin’s user profile preferences.
  5. Log out.

Expected behavior

  1. Log in to site with username or password; access granted; or
  2. Log in to site with “email me a link”; access granted.

Actual behavior

Both “expected” scenarios fail with an error message, and login is not allowed:

The selected two-factor method is not enabled for your account.

There is no further way to log in with the admin’s account.


It is worth noting that I am not actually locked out of the site in question; I had another session still active on another computer and was able to go over to that session and re-add a token-based authenticator to get back in. However, had I not had another session I would have been “fully” locked out.

10 个赞

Thanks for reporting this. I’ve had it bookmarked for the past few days, but haven’t got around to testing it yet. I assume that what you’re reporting is correct, but will take a close look at it next week.

4 个赞

I guess this is the bug? We should not allow that if your site setting says that all admins must have 2fa enabled.

I think you are not fully locked out, you can use the console to recover now, but we should not make it easy for you to create a pathological situation.

I’m not quite sure that’s the right logic? I didn’t have enforce second factor on anything but the default value of “no” and it’s not really safe to assume that every installation has more than one admin account. It seems that once the 2FA keys are removed from the profile, some other flag is not being removed somewhere…

I think you are not fully locked out, you can use the console to recover now

I suppose this is a valid emergency workaround although it may be beyond the skills of an admin who does not also manage their server and they might have to track down a sysadmin.

4 个赞

I’m wondering if the recovery codes were left alone. Can you try entering one of those?

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 的任何普通用户来说也是真实的。