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

时间:2016-02-09 16:30:57

标签: asp.net-web-api oauth-2.0 identityserver3 azure-api-management

我有一个用C#编写的Web API,并在Azure中托管,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访问令牌,但我不认为它理解这种混合流(它可能不需要,因为我们不会要求用户登录)。

或者我应该只放弃和限价请求?

1 个答案:

答案 0 :(得分:2)

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

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

API Management HTTP API确实有一种重新生成密钥的方法。您可以使用它来实现您自己的令牌到期机制,以限制密钥被盗的影响。