应如何使用身份服务器保护多租户 API?



我正在努力寻找使用身份服务器保护多租户 Web API 的正确方法。让我解释一下。

我们有一个多租户 Web API,它服务于 ASP.NET MVC 应用程序。

  • 为每个新客户分配一个新的租户 ID。
  • 客户可以拥有应用程序的多个订阅。其 就像说该应用程序管理每个数据库一样 客户(他可以从相同的基本 URL 访问)。
  • 每个用户属于单个客户(租户),并且具有访问权限 到该客户的所有订阅。

API 的设置方式是每个终结点都包含租户 ID 和订阅 ID,以便它可以知道应从哪个订阅/数据库中获取数据。

<server>/tentantId/subscriptionId/(...)

现在假设我有另一个外部应用(例如控制台应用),使用客户端凭据流,尝试"代表"客户访问某些 API 资源,这意味着将使用特定的 tenantId/subscriptionId 对:

<server>/1000/1/products

每次调用命中其中一个 API 终结点时,我都需要验证此特定客户端应用是否可以访问该租户/订阅。

如果身份服务器可以作为授权流的一部分自动执行该检查,那将很有意义。

如果我们为客户添加了一些方法来注册(同意)特定客户端应用以访问其订阅上的 Web API,则可能我们还可以将标识服务器设置为以作用域的形式知道这一点,或者至少在声明中包含该信息,以便我们可以通过检查令牌而不是调用外部组件来执行权限检查。

这可能吗? 我应该尝试使用范围吗?索赔?

谁能指出我正确的方向?

当您谈论多租户时,您的问题令人困惑。默认情况下,API 不是多租户吗?在我看来,它是一个可以被多个用户/客户端访问的资源。

如果我理解正确,您想要的只是代表用户通过 MVC 应用程序访问 API。换句话说:具有 API 访问权限的混合流。

不要将用户 id 放在路径中,而是使用sub声明中的 id。这使 API 能够区分代表客户端的调用和代表用户的调用。

资源应负责授权。根据授权的类型,您可以使用声明。如果需要检查订阅,则应由 API 完成此操作,使用sub声明来区分用户。

另一方面,作用域用于定义资源。使用范围"api1",我可以访问 Api1 资源 (api)。但它没有提到授权。

IdentityServer 提供身份验证即服务

您的应用有责任提供实际授权

最新更新