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

2024-05-21

我试图了解如何使用 ASP.NET Web API 制作一个 API,该 API 将受到保护CSRF http://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-%28csrf%29-attacks,同时仍然可以从非 Web 环境(例如本机移动应用程序)访问。

我的第一个想法是,非网络环境永远无法成功通过防伪令牌验证,因为它没有发布的表单。这是真的?有什么办法可以让验证工作吗?

如果没有办法进行验证,我的第二个想法是提供一个 API,该 API 可以验证 Web 调用的防伪令牌,但不能验证非 Web 调用的防伪令牌。然而,攻击者似乎可以轻松地使用这个“非 Web”API 进行 CRSF 攻击,对吗?

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

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


仅当您使用持久身份验证机制(例如 cookie、基本身份验证、NTLM 等)时,CSRF 才会成为问题。Mike Wasson 有一个例子 http://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-%28csrf%29-attacks在 Javascript 中针对 Web api 使用 CSRF - 我已经在 DelegatingHandler 中看到了版本 ....

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

话虽如此,如果您要进行身份验证,我会查看某种共享秘密或 OAuth 机制,并使用 DelegatingHandler 服务器端进行验证,然后在 Web 应用程序中将令牌放在可以通过 javascript 获取的位置,通过 X-Authentication 标头发送 - 因为它不是持久性的并且需要附加到每个请求(就像 CSRF 令牌),所以不存在 CSRF 问题。多米尼克一如既往文件 https://github.com/thinktecture/Thinktecture.IdentityServer.v2/wiki这种事情很好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐