软件即服务 (SaaS) 是一个复杂的主题,其中需要考虑很多要点。 在 Azure 上构建 SaaS 解决方案的独立软件供应商 (ISV) 需要解决类似于下面的问题就此做出决定:
- 应使用哪个租户模型?
- 如何设置要在多租户体系结构中使用的标识解决方案?
- 如何处理新客户的加入?
此体系结构旨在回答其中的一部分问题,并为进入 SaaS 世界提供一个起点。 此体系结构能够适应各种方案。
可能的用例
下面是可以使用此体系结构的一些示例用例:
- 将现有应用程序现代化,以便在过渡到基于SaaS 的业务模型过程中支持完整多租户。
- 开发全新的 SaaS 产品。
- 将 SaaS 产品/服务从其他云服务迁移到 Azure。
体系结构
下载此体系结构的 PowerPoint 文件。
术语
下表描述了本文中出现的术语。
术语 | 说明 | 示例 |
---|---|---|
SaaS 供应商或 ISV | 拥有 SaaS 应用程序和代码并销售 SaaS 产品的实体。 | 销售 SaaS 应用程序 Contoso Tickets 的 Contoso Inc。 |
租户 | 从 SaaS 供应商处购买的 SaaS 应用程序实例。 | Fourth Coffee Shop。 |
SaaS 客户管理员 | 购买或管理应用程序租户的人员。 | Fourth Coffee Shop 的老板 Joe。 |
SaaS 客户用户 | 使用但不管理应用程序租户的人员,他们通常与 SaaS 客户管理员属于同一公司或组。 | Fourth Coffee Shop 的事件管理者 Jill,以及 Fourth Coffee Shop 的客户 Susan。 |
最终用户 | SaaS 客户管理员、 SaaS 客户用户或引入的任何其他用户类型。 这是一个通用术语,用于描述登录应用程序的用户。 | Joe、Jill 和 Susan 都是最终用户(从 ISV 的角度讲)。 |
前端应用程序 | 任何前端应用程序。 | 载入并管理应用以及 SaaS 应用程序都是前端应用程序。 |
Workflow
SaaS 客户管理员导航到托管在加入和管理应用上的站点。
SaaS 客户管理员使用用户登录工作流登录。
SaaS 客户管理员完成加入流程。
SaaS 客户管理员导航到加入和管理应用上的租户管理区域,并将 SaaS 客户用户添加到新建的租户。
SaaS 客户用户导航到 SaaS 应用程序应用并使用 SaaS 应用程序。
用户登录
用户登录工作流包括以下步骤:
最终用户导航到前端应用程序并选择“登录”按钮。
前端应用程序将最终用户重定向到标识提供者托管的登录页。
最终用户输入帐户信息并将登录表单提交到标识提供者。
标识提供者使用最终用户的电子邮件地址和对象 ID 发出 POST 请求,以检索该用户的权限和角色。
权限数据 API 在权限数据存储中查找最终用户的信息,并返回分配给该最终用户的权限和角色列表。
标识提供者将权限和角色作为自定义声明添加到 ID 令牌(一个 JSON Web 令牌 (JWT))。
标识提供者将 ID 令牌返回给最终用户,并启动重定向到前端应用程序的操作。
最终用户重定向到前端应用程序上的登录终结点并提供 ID 令牌。
前端应用程序验证提供的 ID 令牌。
前端应用程序返回成功登录页,最终用户现已登录。
有关此登录流程的工作原理的详细信息,请参阅 OpenID Connect 协议。
加入新租户
租户加入工作流包括以下步骤:
SaaS 客户管理员导航到加入和管理应用并填写注册表单。
加入和管理应用向租户数据 API 发出 POST 请求以创建新租户。
租户数据 API 在租户数据存储中创建一个新租户。
租户数据 API 向权限数据 API 发出 POST 请求,以向新建的租户授予 SaaS 客户管理员权限。
权限数据 API 在权限数据存储中创建一条新的权限记录。
权限数据 API 成功返回。
租户数据 API 成功返回。
加入和管理应用向电子邮件通知提供程序发出 POST 请求,以向 SaaS 客户管理员发送“已创建租户”电子邮件。
电子邮件通知提供程序发送电子邮件。
电子邮件通知提供程序成功返回。
加入和管理应用向标识提供者发出请求以刷新 SaaS 客户管理员的 ID 令牌,使其包含发送给新建租户的 JWT 声明。
标识提供者使用 SaaS 客户管理员的电子邮件地址和对象 ID 发出 POST 请求,以检索该管理员的权限和角色。
权限数据 API 在权限数据存储中查找 SaaS 客户管理员的信息,并返回分配给 SaaS 客户管理员的权限和角色列表。
标识提供者将权限和角色作为自定义声明添加到 ID 令牌。
标识提供者将 ID 令牌返回给加入和管理应用。
加入和管理应用将成功消息和新 ID 令牌返回给 SaaS 客户管理员。
将用户添加到租户
将用户添加到租户的工作流包括以下步骤:
SaaS 客户管理员请求从加入和管理应用上的租户管理区域查看租户列表。
加入和管理应用向租户数据 API 发出 GET 请求,以获取 SaaS 客户管理员的租户列表。
租户数据 API 向权限数据 API 发出 GET 请求,以获取 SaaS 客户管理员有权查看的租户列表。
权限数据 API 返回租户权限列表。
租户数据 API 在租户数据存储中查找租户信息,并根据收到的租户权限列表返回租户数据列表。
加入和管理应用将租户数据列表返回给 SaaS 客户管理员。
SaaS 客户管理员从列表中选择一个要将 SaaS 客户用户添加到的租户,并输入该 SaaS 客户用户的电子邮件地址。
加入和管理应用向租户数据 API 发出 POST 请求,以便为指定租户上的 SaaS 客户用户添加权限。
租户数据 API 验证 SaaS 客户管理员是否具有指定的租户的 JWT 声明,以及是否获得了用户对该声明的写入权限。
租户数据 API 向权限数据 API 发出 POST 请求,以便为指定租户上的 SaaS 客户用户添加权限。
权限数据 API 向标识提供者发出 GET 请求,以根据提供的电子邮件地址查找 SaaS 客户用户。
标识提供者返回 SaaS 客户用户的对象 ID。
权限数据 API 使用 SaaS 客户用户的对象 ID 在指定租户上的权限数据存储中为该用户添加一条权限记录。
权限数据 API 成功返回。
租户数据 API 成功返回。
加入和管理应用成功返回。
组件
此体系结构使用以下 Azure 服务:
应用程序服务使你可以采用所选编程语言构建和托管 Web 应用与 API 应用,而无需管理基础结构。
Azure Active Directory B2C 可以轻松为最终用户应用程序启用标识和访问管理。
Azure SQL 数据库是一种通用的关系数据库托管服务,支持关系数据、空间数据、JSON 和 XML。
Azure 逻辑应用让你可以使用简单的图形用户界面 (GUI) 工具快速构建强大的集成。
备选方法
任何替代方法的有效性在很大程度上取决于你希望 SaaS 应用程序支持的租户模型。 下面是在实现此解决方案时可以遵循的一些替代方法示例:
当前解决方案使用 Azure Active Directory B2C 作为标识提供者。 可转而使用其他标识提供者,例如 Microsoft Entra ID。
若要满足更严格的安全性和合规性要求,可以选择为跨服务通信实现专用网络。
无需在服务之间使用 REST 调用,而可以实现事件驱动的体系结构样式进行跨服务的消息传递。
注意事项
这些注意事项实现 Azure 架构良好的框架的支柱原则,可以遵循这一套指导原则来改进工作负荷的质量。 有关详细信息,请参阅 Microsoft Azure 架构良好的框架。
安全性
安全性针对蓄意攻击及滥用宝贵数据和系统提供保障措施。 有关详细信息,请参阅安全性支柱概述。
此解决方案依赖于使用标识作为其安全范式。 Web 应用和 API 的身份验证与授权由 Microsoft 标识平台控制,该平台负责颁发和验证用户 ID 令牌 (JWT)。
成本优化
成本优化是关于寻找减少不必要的费用和提高运营效率的方法。 有关详细信息,请参阅成本优化支柱概述。
操作此解决方案中的组件会产生相关的成本,但对于大多数 Web 应用程序和 SaaS 解决方案而言,该成本并不算高。 此外,可以通过管理以下资源设置来控制成本:
可以扩展运行应用程序的应用服务计划,以满足所需的吞吐量。 此外,如果需要更高的吞吐量,可以在单独的计划中运行每个应用,但这会产生更高的成本。 有关详细信息,请参阅 Azure 应用程序服务计划概述。
Azure AD B2C 提供两个 SKU:Premium P1 和 Premium P2。 这两个 SKU 都根据每月活跃用户数 (MAU) 提供免费额度,但你需要评估每个 SKU 提供的功能,以确定你的用例需要使用哪个 SKU。 有关详细信息,请参阅 Microsoft Entra 外部 ID 定价。
Azure SQL 提供多种购买模型来满足各种用例的需求,包括自动缩放的功能。 你需要评估自己数据库的使用情况,以确保正确调整其大小。 有关详细信息,请参阅比较 Azure SQL 数据库的基于 vCore 和基于 DTU 的购买模型。
性能效率
性能效率是指工作负荷能够以高效的方式扩展以满足用户对它的需求。 有关详细信息,请参阅性能效率支柱概述。
此体系结构应该能够缩放,以轻松满足大多数中型到中大型工作负荷的需求。 由于该体系结构主要使用 Azure 平台(平台即服务 (PaaS))服务,因此有很多选择都可以根据需求和负载来调整解决方案的规模。
部署此方案
如果你要部署此方案,请参阅 GitHub 上的 Azure SaaS 开发工具包。 这是此体系结构的可部署参考实现。
作者
本文由 Microsoft 维护, 它最初是由以下贡献者撰写的。
主要作者:
- Landon Pierce | 客户工程师
其他参与者:
- Chris Ayers | 高级客户工程师
- John Downs | 高级客户工程师
- LaBrina Loving | 首席 SVC 工程经理
- Gary Moore | 程序员/作家
- Nick Pinheiro | 高级顾问
- William Salazar | 高级客户工程师
- Ali Sanjabi | 高级客户工程师
- Arsen Vladimirskiy | 首席客户工程师
- Jason Young | 首席 SVC 工程经理
后续步骤
下面是有关在 Azure 上构建 SaaS 应用程序的一些附加建议资源:
- 在 Azure 上架构多租户解决方案 - 介绍最佳做法。
- Azure 登陆区域的 ISV 注意事项
- Microsoft Azure 架构良好的框架
- WingTips Tickets SaaS 应用程序 - 提供有关数据库层中各种租户模型的利弊的详细信息。