我了解 Cognito 的各种多租户方法,并且我一直致力于“每个租户一个用户池”的方法。因此,例如,我们的 AWS 帐户将为租户 A 提供tenant_a_user_pool,为租户 B 提供tenant_b_user_pool 等。但是,现在我已准备好实施这种方法,我开始重新考虑,我想知道我是否可以用一个用户池做一些更简单的事情,同时仍然实现我的目标,即:安全和灵活性
关于安全性,我假设将用户按用户池分开从本质上来说更安全,只是因为将用户分开的纯粹性质。所以,我的第一个问题是:
至于灵活性,拥有“每个租户一个用户池”将允许为租户 A 配置 SAML 身份验证,而租户 B 可能会选择另一种身份验证方法,例如使用 un/pw 对其用户池进行身份验证。或者,租户 C 可以打开 MFA,而租户 D 可能会关闭它。虽然我不怀疑这种方法可以灵活,但我开始怀疑它是否太复杂,我是否可以使用一个用户池实现相同的效果?
如果我为所有用户使用一个用户池,我正在考虑这样的方法:
在上面的模型中,我添加了一个关联表,tenant_users,因为可能需要让用户在使用一组登录凭据时成为多个租户的一部分(类似于 Slack,我会说)。但是,如果我采用这种方法,我开始怀疑灵活性。例如,我还能让租户 A 使用 SAML 而租户 B 使用其他一些身份验证方法吗? 如果您注意到租户表中,我添加了一个 auth_methods 列,该列将存储租户首选的身份验证方法.我希望我可以在 Cognito 触发器调用的 lambda 中为各种身份验证方法添加身份验证逻辑。但是,我正在进入陌生的领域,所以我不知道什么是可能的。
总结一下,我的问题是......
对此整体方法的任何其他评论将不胜感激。
答案 0 :(得分:3)
如果不知道您正在保护哪些资源以及您如何保护它们,我认为这是一个很难回答的问题,例如
如果所有登录都差不多,那么我会说单个租户可能有意义。
注意事项:
如果其中任何一个的答案是肯定的,那么我想您可能会考虑多个用户池,每个帐户的默认上限为 1000 个用户池,但您可以请求亚马逊增加此上限。
我个人使用“大用户池”方法进行身份验证,但我们在认知之外跟踪授权。最令人头疼的是当租户需要高级安全性(能够查看登录失败、帐户风险等)或 SMS MFA 时,因为它们必须在用户池中启用,从而导致成本大幅增加。
您可能会考虑的另一件事是托管 UI 不允许您预先设置用户名,因此如果您使用的表单采用电子邮件/用户名,然后重定向到适当的托管 UI(在多个-租户情况)对于他们所在的用户池,他们将需要再次重新输入他们的电子邮件。
如果您决定不使用托管 UI 并使用您自己的 UI(或 aws 放大),那么您将失去所有 oauth2/oidc 内容,例如代码流,因此没有 SSO,这会使移动应用程序变得更加困难。
另请注意,自定义身份验证不能与 MFA 混合使用,如果您使用自定义身份验证,您也无法使用托管 UI。