Authentication 如何验证api';谁能访问我的api?

Authentication 如何验证api';谁能访问我的api?,authentication,asp.net-core,architecture,oauth-2.0,asp.net-web-api2,Authentication,Asp.net Core,Architecture,Oauth 2.0,Asp.net Web Api2,我正在构建一个api,我们称之为CommonApi,其他api将使用它。在本例中,假设我们有一个应用程序,其前端使用的supernewrendyframework是best.js和一个WebApi后端,我们称之为AppApi。我们使用的是我们的IDP提供的MS标识 因此,该应用程序将使用自己的api AppApi调用IDP并对用户进行身份验证,通过声明获得所有角色和权限,以及一个访问令牌,以继续使用AppApi和它作为守门员的所有光荣资源 现在,我有点纠结于如何在用户经过身份验证后访问Commo

我正在构建一个api,我们称之为CommonApi,其他api将使用它。在本例中,假设我们有一个应用程序,其前端使用的
supernewrendyframework是best.js
和一个WebApi后端,我们称之为AppApi。我们使用的是我们的IDP提供的MS标识

因此,该应用程序将使用自己的api AppApi调用IDP并对用户进行身份验证,通过声明获得所有角色和权限,以及一个访问令牌,以继续使用AppApi和它作为守门员的所有光荣资源

现在,我有点纠结于如何在用户经过身份验证后访问CommonApi。我已经拥有来自IDP的访问令牌(可能是JWT)以及所有角色和权限。我需要检查AppApi是否被允许访问CommonApi,但我还想在每次调用CommonApi时检查数据库,或者在可以避免的情况下再次调用IDP


是否应该有第二个令牌来访问CommonApi?如果可能的话,我想避免这种情况,但如果这是最好的办法,我会这么做。我不是在寻找特定于技术的解决方案——库、中间件等,而是了解我应该做什么

我认为你只是从错误的角度看问题。正确的观点应该能消除你的困惑

其他API正在访问您的API这一事实无关紧要。一天结束时,您的API服务于客户机,您只需要知道一些客户机正在访问您的API。这可能是另一个API、一个用户、一个控制台应用程序、一个服务,等等。没关系

该客户端需要获得授权才能使用您的应用程序。获得授权的身份验证方法可能因客户端而异,但都达到了相同的目标。例如,类似于另一个API的东西很可能通过客户端身份验证(id/密钥对)进行身份验证。在这里,您正在授权客户机,因此如果该客户机代表某个特定的用户,他们将分别需要作为该用户进行身份验证(通常通过OAuth)。或者,如果另一个API专门为特定用户工作,那么整个过程可以通过OAuth实现(即,客户机本身不进行身份验证,而是该客户机的用户通过客户机提供的OAuth工作流进行身份验证。在任何一种情况下,客户机最终都会得到一个身份验证令牌,然后他们可以发送进一步的请求来授权该请求

重要的部分是身份验证令牌。无论采用何种身份验证方法,都会给出一个身份验证令牌,这就是用于授权请求的内容


根据您在此介绍的场景。最可能的过程是
AppApi
应通过客户端身份验证通过
CommonApi
进行身份验证(它将被分配一个客户端id和一个客户端密码,并将其发送到
CommonApi
上的一个端点以获取访问令牌。然后,它将使用该访问令牌授权
CommonApi
的所有请求。网站用户将使用该网站进行身份验证,并基于该身份验证与
AppApi
进行交互。)但是这与
CommonApi
发生的任何事情都没有关系。唯一的例外是
AppApi
正在为
CommonApi
模拟用户。例如,我可能有一个API在Facebook上做一些事情。如果我需要通过该API作为特定用户进行post,那么用户n需要使用该API通过OAuth工作流直接向Facebook进行身份验证。之后,API被授予一个访问令牌以代表用户进行操作。

因此,在您的场景中,SPA和它自己的API(AppApi)之间会有一个访问令牌吗,从IDP检索?然后,它将有一个访问令牌在AppApi和CommonApi之间使用,该令牌将在AppApi和CommonApi之间使用客户端id、客户端密钥进行客户端身份验证后从IDP检索。我是否正确地遵循了这一点?