您应该如何使用Identity Server保护多租户API?

时间:2018-01-24 17:39:04

标签: identityserver4 identityserver3

我正在努力寻找使用Identity Server保护多租户Web API的正确方法。让我解释一下。

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

  • 为每位新客户分配一个新的TenantId。
  • 客户可以拥有该应用程序的多个订阅。它的 就像说app管理多个数据库一样 客户(他可以从相同的基本URL访问)。
  • 每个用户都属于一个客户(租户)并且可以访问 所有客户的订阅。

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

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

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

<server>/1000/1/products

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

如果Identity Server可以作为授权流程的一部分自动执行该检查,那将是很有意义的。

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

这甚至可能吗? 我应该尝试使用范围吗?权利要求?

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

IdentityServer提供 Authentication as a Service

这是你的应用程序&#39;有责任提供实际的授权

答案 1 :(得分:1)

当你谈论多租户时,你的问题很混乱。默认情况下,它不是API多租户吗?我看待它的方式,它是一个可以被多个用户/客户端访问的资源。

如果我理解正确,您只需要代表用户通过MVC应用程序访问API。换句话说:a hybrid flow with API access

不要将userid放在路径中,而是使用sub声明中的ID。这使得API可以代表客户端和代表用户的呼叫区分。

资源应该照顾authorization。根据授权类型,您可以使用声明。如果需要检查订阅,则应由API使用sub声明来区分用户。

另一方面,范围旨在定义资源。范围&#34; api1&#34;我可以访问Api1资源(api)。但它没有说明授权。