我正在开发一个公共REST API。已注册的客户端将获得API密钥,以便从其服务器(而非浏览器)使用API。单个客户端也可以拥有多个密钥,可能用于其服务器上的唯一应用程序。所以我很好奇人们会在哪里验证API密钥......
使用委派处理程序(通常用于身份验证)并执行密钥查找。
使用授权过滤器查看密钥是否已获得授权。
对于未经授权的,我想返回400 - 不良请求或403 - 禁止(在密钥被暂停的情况下)。
我的第一个想法是关键是授权获取访问权限,而不是使用该服务识别应用程序。但是,在Delegating Handler中执行键查找可以让我更快地(在HTTP消息处理程序中)而不是在授权过滤器触发的Controller中进行短路。
答案 0 :(得分:2)
API密钥是您验证的凭据,基本上是身份验证。我相信消息处理程序是验证和设置主体的好地方。如果允许处理程序先前建立的标识进行该调用,则稍后在管道中运行的授权过滤器可以授权。我在hawk authentication的消息处理程序中实现了Thinktecture identity model,它使用了共享密钥。有关在ASP.NET Web API中使用ttidm和hawk的更多信息,请参阅here。
关于消息处理程序,有几点需要注意。消息处理程序在Web API管道的早期运行,但稍后在ASP.NET管道中运行(假设Web托管)。您在Web API处理程序中建立的标识仅适用于Web API,IIS / ASP.NET对此一无所知。如果您知道只有网络托管服务商,HttpModule
将是一个更好的地方。
在Web API 2中,有一个AuthenticationFilter。我不知道有关这方面的更多细节,但听到Dominick Baier在NDC 2013中提到这一点。如果你计划使用OWIN,另一个候选者是OWIN中间件。