AntiForgery和JSON不兼容?

时间:2012-09-19 23:06:08

标签: asp.net-mvc json orchardcms

我已经在Orchard Modules中成功使用了AntiForgery选项和Ajax。最近,我一直想改变使用默认的ContentType ='application / x-www-form-urlencoded; charset = UTF-8'到JSON有效负载(ContentType ='application / JSON')。

一旦我这样做,我就会得到一个由ASP.NET抛出的异常“未提供所需的防伪标记或无效。”好的,但是如何在保留JSON有效负载的同时添加__RequestVerificationToken呢?

供参考,这是我正在使用的代码:

    var config = {
        url: url,
        type: "POST",
        data: data ,
        dataType: "json",
        contentType: "application/json; charset=utf-8"
    };
    $.ajax(config);

控制器(在提供之前没有提供所需的防伪标记或无效。)

    [HttpPost]
    public ActionResult Update(ShoppingCartItemVM[] items)
    {
       // do stuff
    }

这是Orchard AntiForgery包装器还是MVC AntiForgery功能的限制?或者我是否愚蠢(再次)?

2 个答案:

答案 0 :(得分:2)

吉斯卡德是对的。我会深入挖掘一下。

注意:只有“post”结果在果园控制器中才需要防伪标记。因此,需要记住在json请求中使用“Get”的要求。

通常,您需要发送的数据多于请求令牌。在这种情况下,随请求一起发送的“data”对象必须包含__RequestVerificationToken值。在这种情况下,jQuery很有用,例如:

var defaultPostValues = { __RequestVerificationToken:'@Html.AntiForgeryTokenValueOrchard()', id: 1, ..etc.. };
var myValues = { answers: [1,5,5,10] };
var data = $.extend({}, defaultPostValues, myValues); 

var config = {
    url: url,
    type: "POST",
    data: data ,
    dataType: "json",
    contentType: "application/json; charset=utf-8"
};
$.ajax(config);

每个模块定义也可以关闭防伪令牌(如果我没记错的话)。 Module.txt

Name: Polls
AntiForgery: false
Author: Matt
... removed for brevity 
Features:
    Polls
... etc

但是如果您的电话在Orchard的模块中,我建议使用防伪设备,并且当且仅当您需要外部请求时才需要禁用您的数据。但是我会在Orchard中为这个案例推荐WebAPI,但这会产生一个全新的故事,可能会远远超出范围。

答案 1 :(得分:0)

也许试试这个:

​data = {color: 'red', weight:'20lbs'};

// do some more work...

// Append the anti-forgery token to the POST values: 
data['__RequestVerificationToken'] = '@Html.AntiForgeryTokenValueOrchard()';

// Make the .ajax() call: 
var config = {
    url: url,
    type: "POST",
    data: data ,
    dataType: "json",
    contentType: "application/json; charset=utf-8"
};
$.ajax(config);

如果你在剃刀视图以外的地方形成json,你可以在剃刀视图中执行@Html.AntiForgeryTokenValueOrchard()并将其传递给javascript对象或变量,这样你就可以通过javascript将它添加到json中。

编辑:除了Matthew发布的方法之外,您还可以在进行AJAX调用之前将防伪标记附加到POST值,而不使用.extend()。示例:http://jsfiddle.net/JC66L/