如何保护我的 WebAPI 免受滥用并避免共享 API 密钥?

How can I protect my WebAPI from abuse and avoid sharing API keys?

我有一个用 C# 编写并托管在 Azure 中的 Web API,Azure API 管理 (AAM) 位于该 API 前面并限制请求。

调用 API 的客户端将基于 javascript,并将代表匿名最终用户进行调用。例如,网站的主页可能会通过 javascript 调用我们的 API 以向最终用户显示信息而不要求他们登录。

AAM 确保 API 的调用者具有有效的 API 密钥。如果有人从公开可见的来源获取此密钥,则此密钥有可能被复制和滥用。

是否可以在没有人为干预的情况下使用 OAuth2 获取 JWT 访问令牌并将其暴露在客户端上?

OAuth2 可以发布过期的 JSON Web 令牌,这将降低令牌被盗的风险,但我正在努力在没有任何人为干预的情况下实现这一目标。

OAuth2 主要是关于最终用户启动的授权,但 IdentityServer3 似乎采用混合方法。我可以使用这种混合方法让远程 Web 服务器通过首先从服务器向服务器发送 API 密钥然后在网页中输出 JWT 以供客户端脚本使用来请求令牌吗?

这将隐藏 API 键,并且只显示使用几分钟的 JWT。

AAM 可以与 OAuth2 集成并检查 JWT 访问令牌,但我认为它不理解这种混合流程(它可能不需要,因为我们不会要求用户登录)。

或者我应该放弃并仅请求速率限制?

如果您可以在没有用户干预的情况下生成这些混合 JWT 密钥,那么 API 管理层可以验证它们并使用其中一个声明作为进行速率限制的密钥。通常速率限制是基于 API 管理订阅密钥完成的,但新的 advanced rate limiting policies 允许您基于任何表达式进行速率限制。

我不熟悉IdentityServer 混合模式密钥的工作原理,但通常如果有非交互式登录,则需要保护某种秘密。当 运行 在客户端编写代码时,这总是一个挑战。

API 管理 HTTP API 确实有重新生成密钥的方法。您可以使用它来实现您自己的令牌过期机制,以限制密钥盗窃的影响。