Identityserver4 如何使用Identity Server保护多租户API?

Identityserver4 如何使用Identity Server保护多租户API?,identityserver4,identityserver3,Identityserver4,Identityserver3,我正在努力寻找正确的方法来保护带有Identity Server的多租户Web API。让我解释一下 我们有一个为ASP.NET MVC应用程序服务的多租户Web API 为每个新客户分配一个新租户 客户可以有多个应用程序订阅。它的 这与该应用程序每小时管理多个数据库的说法相同 客户(他可以从相同的基本URL访问) 每个用户都属于一个客户(租户),并且将具有访问权限 所有客户的订阅 API的设置方式是,每个端点都包含租户id和订阅id,这样它就可以知道应该从哪个订阅/数据库获取数据: /te

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

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

  • 为每个新客户分配一个新租户
  • 客户可以有多个应用程序订阅。它的 这与该应用程序每小时管理多个数据库的说法相同 客户(他可以从相同的基本URL访问)
  • 每个用户都属于一个客户(租户),并且将具有访问权限 所有客户的订阅
API的设置方式是,每个端点都包含租户id和订阅id,这样它就可以知道应该从哪个订阅/数据库获取数据:

/tentandi/subscriptionId/(…)

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

/1000/1/产品

每次调用到达某个API端点时,我都需要验证此特定客户端应用程序是否可以访问该租户/订阅

如果Identity Server能够作为授权流程的一部分自动执行该检查,这将非常有意义。

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

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


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

IdentityServer提供


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

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

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

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

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


另一方面,作用域用于定义资源。通过作用域“api1”,我可以访问api1资源(api)。但它没有提到授权。

我理解这一点。这里的想法是至少使用identity server管理的信息(范围?)来执行授权。这样就避免了对外部源的另一次调用(每次访问每个API端点时),以检查该特定客户端是否有权访问该租户/订阅。这有意义吗?你可以使用每个客户端的作用域。例如,一个API具有所需的作用域“myapi”。然后,所有在其允许范围内具有此范围的客户端都可以访问API。IdentityServer将拒绝其他客户端。如果这是你想要实现的,这就是你的解决方案。但据我所知,您希望一个客户端可以访问api的一些控制器,另一个客户端可以访问其他控制器。这是IdentityServer无法控制的。您如何看待将客户端声明传递给API控制器,并使用该信息实现自定义策略(作为要求)以验证客户端应用程序是否对每个控制器具有正确的声明?好吧,对我来说,这是您应该做的,如果您想实现您的目标,但这也是我最初所说的——客户机正在执行
授权
。采用这种方法。我想我的英语资源使我更难解释整个想法。用户id不在路径中。路径中的是tentant/订阅,这是因为我们希望用户能够使用URL直接在浏览器中访问MVC(SPA)应用程序中的特定视图。我们的MVC应用程序使用混合流,但问题是外部应用程序试图通过使用相应的URL直接使用API访问特定租户/订阅的数据。当请求到达该URL时,我需要验证客户端应用程序是否可以访问该订阅。对于外部应用程序,您使用客户端\u凭据流。作为其配置的一部分,您可以添加tenantid作为声明。然后,资源可以通过检查租户是否拥有请求的订阅来授权请求。您仍然可以将租户保留在路径中,但它必须等于其中一个声明的值。对于客户端有权访问的每个租户,您添加一个声明,而路径指定租户/订阅。@RuardvanElburg“默认情况下不是API多租户吗?”。不可以。不要混淆多租户和多用户。多租户可以扩展多用户,但默认情况下API不是多租户。>验证此特定客户端应用程序是否可以访问该租户/订阅开发人员已明确声明idsrv3是:(除了IdentityServer 4之外,我有完全相同的问题。你最终是如何处理的?@CShark我使用用户声明在Identity Server 4上解决了这个问题。用户有或没有声明可以访问给定的租户/订阅。控制器操作上有一个授权策略,该策略检查并返回禁止,如果不存在正确的索赔。