【发布时间】:2018-04-18 20:13:01
【问题描述】:
我们有一个多实例 Saas 应用程序:
- 我们的每个客户都有自己的网站实例和自己的子域。
- 我们的应用程序(Web 应用程序和 API)受 Azure 保护,目前使用 ADAL javascript 库
- 我们还有一个需要保护的用于系统级集成的第二个 API,目前使用第二个“本机”Azure 应用,但这可能不正确,我们希望整合
- 我们的应用程序通过 AzureAD Graph API 和 Microsoft Graph API 读取和写入 Azure AD(包括密码重置调用)
我们正在研究 Azure AD 应用程序配置选项,并希望确保我们正在构建最合理、最安全的 Azure AD 应用程序。以下是我们一直在查看的一些文档:
https://docs.microsoft.com/en-us/azure/architecture/multitenant-identity/
https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-compare
我们希望应用程序是多租户的,以简化配置,并允许库中的可用性;但是在考虑这样做时,我们会遇到一些安全问题。
A.使用哪个应用程序版本
- 1) v1。允许访问两个 Graph API。正如微软建议的那样,当我们不关心微软帐户时,我们应该使用它。
- 2) v2。在查看 MS Graph API 文档时,它建议使用 v2。据报道不适用于 AzureAD Graph API?允许同一个应用具有多种类型(Web 应用/API 和本机),我们可能需要也可能不需要保护我们的 Web api 和我们的系统 api(我们仍在尝试建模)。
B.当我们的客户有不同的子域时,如何管理回复 URL?
我注意到以下选项:
- 1) 在应用注册表中,我们为所有客户添加回复网址。这似乎没问题,因为我们只需要这样做一次,但感觉很奇怪。回复网址的数量有限制吗?
- 2) 有一个回复 url,但管理一个外部工具以利用 state url 参数将响应路由到正确的实例。 Microsoft 似乎在此链接中建议:https://docs.microsoft.com/en-us/azure/architecture/multitenant-identity/authenticate 我不确定 ADAL 是否允许我们设置返回子域 url 的状态。这种方法常见吗?
- 3) 我们客户端目录中的每个ServiceProvider 实例是否可以将回复url 配置到自己的子域?我觉得这将是最干净的方法,但我没有看到它的文档。如果我们也能以编程方式设置 replyURL 那就太好了。
C.如何管理对 Graph API(AzureAD 和 Microsoft Graph)的授权
我注意到以下选项:
- 1) 使用带有单个应用程序密钥的客户端凭据流(用于所有客户端)。当客户订阅时,他们将管理员同意我们的应用程序授予应用程序对其目录的权限。当然,我们会尽最大努力保护该密钥的安全。但是,如果由于某种原因被入侵,这将使我们所有的客户都面临风险,而不仅仅是一个被入侵的实例。
- 2) 与 1 相同,但使用证书而不是密钥。我知道这可能会更安全一些,但我看不出它不会遇到与 1 相同的问题。
- 3) 不使用应用程序权限,而是对管理员用户使用委派权限。这会很好,因为它本质上可以防止我们的应用程序的一个实例与错误的目录通信。但是更改管理员可能会中断服务;我认为最好的审计方式是让我们的应用程序对其所做的更改负责。 (另外,委托权限是否允许重置密码?我知道您需要运行 powershell 脚本来升级应用程序的目录角色以获得应用程序权限)
- 4) 服务主体是否可以通过某种方式在创建时为其目录生成唯一密钥?这可以通过编程方式交还给我们的应用程序吗?也许在管理员同意期间?
【问题讨论】:
标签: azure azure-active-directory microsoft-graph-api azure-ad-graph-api