SPA 调用资源服务器受两个不同的身份提供者保护
SPA calling resource servers protected with two different identity providers
我们部署了一个 SPA (angular),它针对 azure AD B2C 进行身份验证并检索令牌,然后用于调用一些其他 API。
现在我被要求调用其他一些受另一个 azure AD B2C(同样不受我们控制)保护的 API(不受我们控制)。我认为没有任何方法可以“联合”两个 AD B2C。
此外,我不知道是否有办法使用一些隐藏的凭据(假设在第二个 AD B2C 上定义的技术 user/password)从 AD B2C 获取访问令牌,我不会出于显而易见的原因在 SPA 中使用,但随后我可以使用经过身份验证的 API 作为代理从第二个 B2C 获取令牌,然后使用获取的令牌调用外部 API。
我是不是遗漏了什么,或者有人问我一些 Azure AD B2C 不可行的问题?
我找到的唯一解决方案是让第二个 azure AD B2C 的供应商在其 B2C 中声明新的应用程序注册,并且:
- 在“证书和机密”下,他们会添加一个新的客户端机密(他们会与我们共享,并且需要至少每两年重新创建一次)
- 在“API 权限”下,他们需要指定哪些 API(通过作用域)可以使用使用上述客户端密钥生成的令牌进行访问
然后我们将调用我们经过身份验证的 APIs(使用通过交互式 oauth 流程从我们的 B2C 获得的令牌保护)并且 APIs 将通过调用他们的 APIs 在我们通过客户端密钥获得令牌后。
所有这些都可以使用不同的 API 容器来完成,在它们前面有一个 API 网关以获得更干净的架构,以便我们的核心 API 与代理分开 APIs.
有谁知道更好的解决方案吗?
您的 SPA 无法轻松地与 2 个独立的授权服务器(或 API 组)建立直接安全关系。听起来这里有一些安全边界可以由您的后端 APIs 更好地管理,它可以保守秘密,这与您的 SPA 不同。
有时一个有用的模式是设计 2 个级别的 API,例如:
- 美国西部用户的在线销售 SPA 是 运行
- SPA 调用在线销售(入口点)API 在美国东部托管,距最终用户 3000 英里
- 入口点 API 以低延迟聚合对核心 API 的调用,因为它们都彼此相邻托管
- 入口点API还可以处理安全边界,例如将调用转发到APIs
的新集合
就我个人而言,我喜欢你的代理建议,但我不会在核心微服务中这样做——我会像上面那样将此责任分配给入口点/聚合 API。这会产生一个额外的层,但只需要简单的代码,并且可以避免增加任何其他组件的复杂性。
我们部署了一个 SPA (angular),它针对 azure AD B2C 进行身份验证并检索令牌,然后用于调用一些其他 API。
现在我被要求调用其他一些受另一个 azure AD B2C(同样不受我们控制)保护的 API(不受我们控制)。我认为没有任何方法可以“联合”两个 AD B2C。
此外,我不知道是否有办法使用一些隐藏的凭据(假设在第二个 AD B2C 上定义的技术 user/password)从 AD B2C 获取访问令牌,我不会出于显而易见的原因在 SPA 中使用,但随后我可以使用经过身份验证的 API 作为代理从第二个 B2C 获取令牌,然后使用获取的令牌调用外部 API。
我是不是遗漏了什么,或者有人问我一些 Azure AD B2C 不可行的问题?
我找到的唯一解决方案是让第二个 azure AD B2C 的供应商在其 B2C 中声明新的应用程序注册,并且:
- 在“证书和机密”下,他们会添加一个新的客户端机密(他们会与我们共享,并且需要至少每两年重新创建一次)
- 在“API 权限”下,他们需要指定哪些 API(通过作用域)可以使用使用上述客户端密钥生成的令牌进行访问
然后我们将调用我们经过身份验证的 APIs(使用通过交互式 oauth 流程从我们的 B2C 获得的令牌保护)并且 APIs 将通过调用他们的 APIs 在我们通过客户端密钥获得令牌后。
所有这些都可以使用不同的 API 容器来完成,在它们前面有一个 API 网关以获得更干净的架构,以便我们的核心 API 与代理分开 APIs.
有谁知道更好的解决方案吗?
您的 SPA 无法轻松地与 2 个独立的授权服务器(或 API 组)建立直接安全关系。听起来这里有一些安全边界可以由您的后端 APIs 更好地管理,它可以保守秘密,这与您的 SPA 不同。
有时一个有用的模式是设计 2 个级别的 API,例如:
- 美国西部用户的在线销售 SPA 是 运行
- SPA 调用在线销售(入口点)API 在美国东部托管,距最终用户 3000 英里
- 入口点 API 以低延迟聚合对核心 API 的调用,因为它们都彼此相邻托管
- 入口点API还可以处理安全边界,例如将调用转发到APIs 的新集合
就我个人而言,我喜欢你的代理建议,但我不会在核心微服务中这样做——我会像上面那样将此责任分配给入口点/聚合 API。这会产生一个额外的层,但只需要简单的代码,并且可以避免增加任何其他组件的复杂性。