通过将未知电子邮件添加到组来绕过SSO

假设某个站点已启用 SSO。

当通过此处描述的界面批量将用户添加到群组时,如果输入列表中的某个邮箱在 Discourse 中尚不存在,系统将发送邀请邮件。

点击该链接后,您将被引导至 Discourse 内的账户创建页面:

填写表单后,账户即被创建。但所创建的账户不包含任何 SSO 信息:

问题所在非常明显:

  • 绕过我们的 SSO 认证系统是非常危险的。
  • 由于缺乏“即将向 X 人发送邮件”的提示,我在未意识到会发送消息的情况下,不慎向他人发送了垃圾邮件。

预期行为:

  • 在批量添加用户到群组时,如果已启用 SSO,则应忽略任何尚未存在于站点上的邮箱地址。
7 个赞

感谢您报告此问题。我可以在我的开发站点上复现该问题。当启用 SSO 时,如果将尚未注册到站点的电子邮件添加到群组中,这些电子邮件应被忽略。我们将修复此问题。给您带来的不便,我们深表歉意。

8 个赞

已在 PR #11950PR #11951 中修复。感谢您的报告!:smiley:

7 个赞

此主题在最后一次回复后 24 小时自动关闭。不再允许新回复。

@Grayden_Shand 实际上,我们目前正在考虑在邀请兑换页面添加 SSO 认证。用户在兑换邀请时,将通过 SSO 进行认证,而无需填写注册表单。这是否符合您的需求?

@sam 我正在思考邀请流程,其中有一点我不确定:邀请发送到的邮箱是否必须与 SSO 邮箱一致?看起来我们可以对基于邮箱的邀请强制执行此规则,但对于基于链接的邀请则不行。您怎么看?

3 个赞

是的,我们必须强制执行此规定,尤其是对于需要账户审核的网站。

因此,您可以启用 Facebook 认证,禁用本地认证,同时仍然能够接纳新用户。

不过,邀请链接(显然)在此处可以绕过限制,因为它们不与特定邮箱关联。

1 个赞

就我们的使用场景而言,最好能够完全禁用邀请邮件。对于我们的大多数站点(用于在线课程的临时社区),注册窗口期有限(且需要付费)。因此,我想象如果有人收到站点邀请,随后却发现实际上已无法加入,他们会感到沮丧。我们确实没有任何情况下希望有人收到我们站点的邀请。

如果您决定推进此功能,我建议同时添加一个警告,内容类似于:“您即将向 XX 位非本站用户发送邮件:bob@example.com、alice@example.com、……"这样我们就能找到这些用户,并将他们从批量添加列表中移除。

那么,您的使用场景能否改用邀请链接呢?这样既不会给任何人发送邮件,还可以设置过期时间。

我仍然支持一些“忍者模式”来绕过发送邮件的步骤,以便您将大量邮箱地址添加到白名单中。但我很好奇,邀请链接功能是否已经解决了您在这里的需求。

1 个赞

我想不太行,但也可能是我没理解您的问题。让我解释一下我们如何使用 Discourse、SSO 功能,以及我最初遇到这个 bug 的原因。

我们运营一个在线学习平台,为每个工作坊(课程)的每期会话都提供一个临时的 Discourse 论坛。

我们使用 SSO 配合自定义认证系统,主要基于两个原因:

  1. 用户只需创建一套凭据,即可访问其注册的任何课程。
  2. 根据我们数据库中的任意数据,强制执行策略,控制谁可以进入每个 Discourse 论坛。例如,在我们的 Discourse SSO 端点中,我们会检查用户是否具有有效的注册信息,以及日期是否在我们的开放和关闭日期范围内。

我遇到上述 bug 是因为我们想在一个工作坊中创建一个仅限另一个工作坊学员加入的群组(例如校友群)。于是,我将另一个工作坊的完整班级名单添加到了批量添加弹窗中,结果不小心向名单中所有未注册当前工作坊的人发送了邀请。

因此,我们实际上永远不会使用 Discourse 的邀请功能(无论是通过链接还是邮件)。如果我们确实需要邀请功能,可能得自行开发,因为我们希望在发出的任何邀请之上叠加一些业务逻辑。例如,如果工作坊的注册期已结束,我们希望该链接显示错误消息;或者,我们可能希望在链接中包含折扣信息。

总之,如果不需要使用它,目前的方案是可行的。但我们确实不希望再担心无意中向那些在该 Discourse 论坛中没有账户的人发送邮件。

3 个赞