首页 > 解决方案 > 使用微服务进行 API 授权

问题描述

我有一个多租户项目,它将调用多个微服务来执行特定任务。

我希望微服务能够从发送的请求中了解要使用哪个数据库,因为每个租户都将使用微服务,但是,租户将拥有自己的数据库。我有另一个解决方案,它有一个处理 API 密钥管理的 Web 项目。

例如,API 密钥管理位于域:portal.example.com

当 tenant.example.com 在 microservice.example.com 调用微服务时,我希望一些中间件在微服务端监听请求并从请求中获取 APIKey,通过检查 portal.example.com 服务来验证它,如果APIKey 有效,获取此 API 密钥的租户并确定用于微服务的连接字符串。

我觉得这似乎效率不高,因为它需要太多调用才能确定要使用的连接字符串,谁能想到更好的方法来确定连接字符串,同时验证 APIKey?

标签: c#apimicroservices

解决方案


问题的性质似乎需要更多关于某些业务决策和架构决策的信息。

但是根据您迄今为止提供的信息,我想说您所指的连接字符串也可能是数据泄漏的问题。鉴于如果授权服务中存在发送错误连接字符串的错误,您可能会不小心将客户端连接到另一个数据库,而不是发出请求的实际客户端。第二点是它也使授权服务成为单点故障。如果它失败或恶意用户访问它,所有租户都会受到影响。

与其让架构处理这个问题,值得评估的一件事是使用 OAuth 的客户端凭据对不同的应用程序进行身份验证;每个应用程序都反映了一组不同的数据库参数。在 OAuth 身份验证阶段,它会将用户重定向到正确的应用程序。总之,为每个租户部署了一组应用程序,其中租户通过 OAuth 进行身份验证。

一个稍微不同的替代方案是使用各自的数据库凭据为另一个租户部署和复制您用于一个租户的整个堆栈。仅当您受到开发资源的限制时,我才会提倡这一点。


推荐阅读