如何使用公钥保护 Web API 免受未经授权的访问?

Posted

技术标签:

【中文标题】如何使用公钥保护 Web API 免受未经授权的访问?【英文标题】:How to secure a web API with public key from unauthorized access? 【发布时间】:2019-06-05 09:07:39 【问题描述】:

在了解 Web API 的性质的同时,提出了一些关于其安全性的问题。设计 Web API 的最佳实践是什么,以便只有授权用户才能访问它。我尝试检查以下选项,但没有一个能够实现完美的安全性。

1) 我不能依赖请求来源、引荐来源或用户代理字符串,因为它们很容易被欺骗。

2) Web API 只需要一个公钥来访问它,因此 CSRF 令牌也不适合实现。

有没有其他方法可以确保请求仅来自受信任的来源?

我的用例是我想实现像谷歌地图这样的客户端 API,任何购买了 API 访问权限的人都会将他们的网站域列入白名单,并且可以在他们的网站上包含我的插件。然后插件将代表用户向我的 API 发出请求。

如果我在 Web API 上应用一些请求签名逻辑,这样我的服务器可以验证请求者并拒绝未经授权的来源,这是个好主意。我假设我必须对我的请求签名逻辑保密,因此我可能需要对代码进行一些混淆。

【问题讨论】:

我认为您正在尝试解决 2 个不同的项目:一个是授权,另一个是将域列入白名单。关于授权,您是否考虑过访问令牌 (OAuth)?如今,许多著名的 SaaS 企业都使用它来授权他们的用户(例如 Google、Stripe)。您关于域/源检查的另一个问题是,在没有基于令牌的身份验证机制的情况下,这是一种实际要求还是更多的安全机制? @MoA 在我所说的场景中,公共 API 密钥和请求源域仅意味着授权用户。而且它们都无法防止未经授权的访问。我正在寻找某种方法来确保只有列入白名单的域才能发出请求,而没有其他人可以通过伪造来源或引荐来源标头来发出请求。 OAuth 在这里没用。 【参考方案1】:

你没有提到任何关于用例的事情,尤其是当客户是一个系统或一个人的时候?

首先,默默无闻的安全从来都不是一个好的选择。其次,“创建自己的安全系统”被认为是不好的做法,最好站在有安全知识和经验的人的肩膀上。

在不知道确切的用户案例的情况下,很难提出很多建议......但是,我建议你看看 jwt 令牌之类的东西(我猜你在 webclient 后面有一个人您的网络服务的用户)......因为你已经用 asp.net-web-api 标记了这个问题,我还建议你看看https://identityserver.io 项目......我以前成功地使用过 IdentityServer4一个大型的 asp.net webapi 项目...

【讨论】:

我已经更新了我的问题并添加了用例。用户将在他们的网站上安装一个小部件,该小部件将发出 API 请求。用户必须将他们应该发送请求的域列入白名单。

以上是关于如何使用公钥保护 Web API 免受未经授权的访问?的主要内容,如果未能解决你的问题,请参考以下文章

如何发布访问 REST api 的 jQuery 代码,但保护它免受未经授权的使用

apache_conf 保护.htaccess免受未经授权的访问

如何保护 ASP.NET Core Web API 免受被盗 JWT 令牌以进行模拟

如何在不经过注册用户身份验证的情况下保护公共API请求

可以使用 Cloudflare 缓存和保护 REST API 吗?

.net Core 3 Web API JWT 未经授权