.net 如何使用主干单页应用程序测试MVC4中的AntiForgeryToken

.net 如何使用主干单页应用程序测试MVC4中的AntiForgeryToken,.net,asp.net-mvc-4,backbone.js,single-page-application,attributerouting,.net,Asp.net Mvc 4,Backbone.js,Single Page Application,Attributerouting,我在让Microsoft的MVC的[ValidateAntiForgeryToken]与使用木偶网和主干网编写的单页应用程序(SPA)一起工作时遇到问题。问题似乎是MVC[ValidateAntiForgeryToken]方法无法看到我们作为JSON的一部分发送的令牌。我们认为这是因为代币必须在答复的形式部分,但MrOggy85说这不是问题(见下面他的回答) 代码在我使用的api控制器中,我们认为这是导致问题的原因。典型的操作如下所示: // POST api/vizschemes/

我在让Microsoft的MVC的
[ValidateAntiForgeryToken]
与使用木偶网和主干网编写的单页应用程序(SPA)一起工作时遇到问题。问题似乎是MVC
[ValidateAntiForgeryToken]
方法无法看到我们作为JSON的一部分发送的令牌。我们认为这是因为代币必须在答复的形式部分,但MrOggy85说这不是问题(见下面他的回答)

代码在我使用的api控制器中,我们认为这是导致问题的原因。典型的操作如下所示:

    // POST api/vizschemes/
    [POST("")]
    [Authorize(Roles = "...some role...")]
    [ValidateAntiForgeryToken]
    public ActionResult Add(CreateUpdateSmVizSchemeDto dto,  ICreateSmVizScheme service)
    {
       ... code to update the VizScheme and return json
    }
还有其他人克服了这个问题吗?很多谷歌搜索都发现了这样一条评论:“ASP.NET MVC通过AntiForgery类和[ValidateAntiForgeryToken]属性为防伪令牌提供内置支持。目前,此功能未内置到Web API中。但是,(KnockoutJS)模板包含Web API的自定义实现。”。这表明他们自己写,我也能做到

还有其他人碰到过这个问题吗?如果是,你是如何解决的?我是否遗漏了一些明显的内容,还是应该编写自己的ValidateAntiForgeryToken方法?如果您能提供意见,我们将不胜感激

更新
@MrOggy85提供了很棒的stackoverflow链接,其中包含更多信息。看见我计划编写我自己的AntiForgery测试,完成后将发布。

我不知道AntiForgery,但主干可以配置为并绕过服务器的此类限制

Backbone.emulateHTTP = true;
Backbone.emulateJSON = true;

这将告诉主干网仅使用
POST
方法进行
delete()
update()
并将数据作为
application/x-www-form-urlencoded
发送,而不是在视图中使用helper
@Html.AntiForgeryToken()
时使用
application/json

这是实际的Html结果:

<input name="__RequestVerificationToken" type="hidden" 
value="{ long cryptic code }">
现在你的服务器很开心,你也很开心

更新:

内容类型很重要,因为MVC绑定器如何验证请求。如果您想使用另一种内容类型,此解决方案建议在两个不同的参数中分离antiforgery令牌和postdata。

Hi@mor,谢谢。我的问题是处理MVC[ValidateAntiForgeryToken],如果我在MVC中使用标准方法,它要求所有数据以表单提交的形式返回。问题是,我应该改变主干来实现这一点,还是在MVC中实现我自己的令牌检查。我想知道是否有人在用MVC构建单页应用程序时遇到过这个问题,以及他们是如何解决的。我们已经完全尝试了您编写的代码,但由于“必需的防伪表单字段”\uuu RequestVerificationToken“不存在”而失败。我们认为这是因为令牌不是HttpRequest的一部分。我们已验证响应中是否存在令牌。你有上面的代码在应用程序中工作吗?也许我们错过了什么?你是否也在行动中加入了[HttpPost](我有时忘记了这么做…)?是的,我的解决方案在一个活动的web应用程序中工作。感谢您的输入MtOggy85,这非常有帮助,但我仍然有一个问题。至少你已经澄清了,它不必是请求的形式部分。我已经更新了我的问题,将我们的代码包含在api中。我只能假设属性运算会导致问题,但我看不出是怎么回事。嗨,MrOggy85。一个想法是,我们将数据作为JSON发送。我假设您使用的是x-form-www-urlencoded,您能确认一下吗。这可能就是问题所在,尽管MVC活页夹应该会解决这个问题。我明天(几个小时后)会检查
$.ajax({
  url: 'something/something',
  type: 'POST',
  contentType: 'application/x-www-form-urlencoded; charset=UTF-8', // Default
  data: { 'somekey': 'someval', 
          '__RequestVerificationToken', antiforgeytoken }
});