【问题标题】:How do I verify an api's access to my api?如何验证 api 对我的 api 的访问?
【发布时间】:2018-01-22 14:37:40
【问题描述】:

我正在构建一个 API,我们将其称为 CommonApi,其他 API 将使用该 API。对于此示例,假设我们有一个应用程序,其前端使用superNewTrendyFrameworkThatsTheBest.js 和一个 WebApi 后端,我们将其称为 AppApi。我们使用的是我们的 IDP 提供的 MS Identity。

因此,应用程序将使用自己的 API AppApi 调用 IDP 并对用户进行身份验证,通过声明获取所有角色和权限,以及访问令牌以继续使用 AppApi 和所有它是看门人的光荣资源。

现在,我有点卡住的部分是在用户已经通过身份验证后如何访问 CommonApi。我已经拥有来自 IDP 的访问令牌(可能是 JWT)以及所有角色和权限。我需要检查 AppApi 是否允许 访问 CommonApi,但如果可以避免,我还希望每次调用 CommonApi 或再次调用 IDP 时检查数据库。

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

【问题讨论】:

    标签: authentication asp.net-core architecture oauth-2.0 asp.net-web-api2


    【解决方案1】:

    我认为您只是从错误的角度看待事物。正确的观点应该可以消除您的困惑。

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

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

    重要的部分是身份验证令牌。不管是什么认证方式,都会给出一个auth token,that就是用来授权请求​​的。

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

    【讨论】:

    • 那么,在您的场景中,SPA 和它自己的 API (AppApi) 之间是否存在从 IDP 检索的访问令牌?然后,它将在 AppApi 和 CommonApi 之间使用一个访问令牌,该令牌将在 AppApi 和 CommonApi 之间使用 client_id、client_secret 进行客户端身份验证之后从 IDP 中检索到。我正确地遵循了吗?
    猜你喜欢
    • 2019-12-18
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 2023-03-17
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    相关资源
    最近更新 更多