【问题标题】:How does ValidateAntiForgeryToken fit with Web APIs that can be accessed via web or native app?ValidateAntiForgeryToken 如何与可通过 Web 或本机应用程序访问的 Web API 匹配?
【发布时间】:2013-03-23 05:53:24
【问题描述】:

我正在尝试了解如何使用 ASP.NET Web API 制作一个 API,该 API 将受到 CSRF 的保护,同时仍可从非 Web 环境(例如本机移动应用程序)访问。

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

如果没有验证方法,我的第二个想法是提供一个 API,它可以验证 Web 调用的防伪令牌,但不能验证非 Web 调用。但是,攻击者似乎可以很容易地使用这种“非 Web”API 进行 CRSF 攻击,对吧?

答案是非 Web API 只需要支持非 Web 身份验证机制(OAuth?),因此无法通过浏览器重放对它的请求吗?还是有更简单的方法?

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

【问题讨论】:

    标签: asp.net-web-api antiforgerytoken


    【解决方案1】:

    只有当您使用持久性身份验证机制(例如 cookie、基本身份验证、NTLM 等)时,CSRF 才会成为问题。Mike Wasson 有 an example 在 Javascript 中针对 webapi 使用 CSRF - 我在 DelegatingHandlers 中看到了版本。 ..

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

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

    【讨论】:

    • 据我所知,“X-Requested-With”标头并没有自然地放在请求中,只有像 jquery 这样的框架
    【解决方案2】:

    看看 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。这样可以防止其他网站在浏览器中加载攻击代码。

    【讨论】:

    • 限制到本地主机似乎对原生移动应用程序没有帮助,对吧?
    • 我使用的是phonegap,它在客户端本地运行。
    【解决方案3】:

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

    【讨论】:

    • 我已经有一个反 CSRF 实现(通过 DotNetNuke 服务框架),我只是想了解它如何/是否适用于本机应用程序。如果没有 AJAX 或表单 POST,我在 SPA 模板中看不到任何可以使他们的 API 工作的东西。
    猜你喜欢
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    相关资源
    最近更新 更多