ValidateAntiForgeryToken如何适用于可通过Web或本机应用程序访问的Web API?

时间:2013-04-02 03:32:48

标签: asp.net-web-api antiforgerytoken

我试图了解如何使用ASP.NET Web API制作API,该API将受到CSRF保护,同时仍可从非Web环境(例如原生移动设备)访问应用)。

我的第一个想法是,非网络环境永远无法成功通过反伪造令牌验证,因为它没有张贴的表单。这是真的?有没有办法让验证工作?

如果没有办法验证,我的第二个想法是提供一个API,用于验证网络电话的防伪令牌,但不能用于非网络电话。然而,看起来攻击者似乎很容易就能够使用这个非网络" CRSF攻击的API,对吧?

非Web API需要的答案是仅支持非Web身份验证机制(OAuth?),以便无法通过浏览器重播对它的请求吗?或者有更简单的方法吗?

如果这是唯一的方法,是否有一种简单的方法来关闭所有不安全的身份验证机制?在ASP.NET Web API中是否应该有一些简单/快乐的路径来支持这些场景?

3 个答案:

答案 0 :(得分:6)

当您使用持久性身份验证机制(例如cookie,基本身份验证,NTLM等)时,CSRF只会成为一个问题.Mike Wasson在Javascript中使用CSRF对抗webapi {我已经看到了DelegatingHandlers中的版本....

由于CSRF只是Web场景中的一个问题,因此您可以认为没有必要检查非Web请求。来自浏览器的每个ajax请求,无论是通过jquery,本机XmlHttpRequest类还是带有标头的任何内容 - X-Requested-With,其值都为XMLHttpRequest。因此,您可以将CSRF检查限制为仅具有该标头的请求,因为没有它的任何内容必须来自浏览器之外。

话虽如此,如果您要进行身份验证,我会查看某种共享密钥或OAuth机制,并让DelegatingHandler服务器端进行验证,并且在Web应用程序中只需将令牌放在某处即可通过javascript获取并通过X-Authentication标头发送 - 因为它不是持久的并且需要附加到每个请求(就像CSRF令牌),没有CSRF问题。多米尼克和以前一样,an example这种事情很好。

答案 1 :(得分:0)

查看最新MVC4更新中的SPA模板。他们有针对Web API的Anti-CSRF的示例实现。

答案 2 :(得分:0)

看一下WebAPI的CORS实现。

http://blogs.msdn.com/b/carlosfigueira/archive/2012/07/02/cors-support-in-asp-net-web-api-rc-version.aspx

然后,您只能将localhost作为webapi服务器上的有效URI。这样可以防止其他网站在浏览器中加载攻击代码。