Asp.net mvc 防伪和JSON不兼容?

Asp.net mvc 防伪和JSON不兼容?,asp.net-mvc,json,orchardcms,Asp.net Mvc,Json,Orchardcms,我已经在Orchard模块中成功地将Antifforgery选项与Ajax结合使用了一段时间。最近,我一直想改变使用默认ContentType='application/x-www-form-urlencoded;charset=UTF-8'到JSON负载(ContentType='application/JSON') 我一执行此操作,就会收到ASP.NET引发的异常“未提供所需的防伪令牌或该令牌无效”。好的,但是如何在保留JSON负载的同时添加_urequestVerificationToke

我已经在Orchard模块中成功地将Antifforgery选项与Ajax结合使用了一段时间。最近,我一直想改变使用默认ContentType='application/x-www-form-urlencoded;charset=UTF-8'到JSON负载(ContentType='application/JSON')

我一执行此操作,就会收到ASP.NET引发的异常“未提供所需的防伪令牌或该令牌无效”。好的,但是如何在保留JSON负载的同时添加_urequestVerificationToken呢

以下是我使用的代码供参考:

    var config = {
        url: url,
        type: "POST",
        data: data ,
        dataType: "json",
        contentType: "application/json; charset=utf-8"
    };
    $.ajax(config);
控制器(在到达此处之前,爆炸时显示“未提供所需的防伪令牌或该令牌无效”):

这是Orchard AntiForgery包装的限制还是MVC AntiForgery功能的限制?还是我(又一次)愚蠢了?

也许可以试试这个:

​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);
如果要在razor视图以外的其他位置生成json,可以在razor视图中执行
@Html.AntiForgeryTokenValueOrchard()
,并将其传递给javascript对象或变量,以便通过javascript将其添加到json中


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

Giscard是正确的。我会挖得更深一点

注意:只有orchard controller中的“post”结果需要防伪令牌。因此,不需要记住在json请求中使用“Get”的位置

通常,您希望发送的数据不仅仅是请求令牌。在这种情况下,随请求发送的“数据”对象必须包含该u 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的模块内,我建议您使用antiforgery,并且仅当外部请求需要您的数据时才禁用。但我会推荐Orchard内部的WebAPI解决这个问题,但这会创造一个全新的故事,而且可能会超出范围

为什么需要发送JSON?或者你正在和你的Orchard服务器交谈,它会很好地理解post(包括绑定复杂的数组参数,就像你在那里看到的那样),或者它是一个外部服务,不关心防伪。Json不是一个要求。但我在这个领域屡屡犯错,我需要知道是我还是我没有意识到的某些限制。马修和吉斯卡说得很清楚,是我!感谢您的帮助。您可以关闭每个模块,也可以关闭每个控制器操作。我的示例未经测试,但我认为即使已经有一些值分配给
数据
var(请参见此处,了解如何将新的键/val对分配给现有的javascript对象:)。您和Giscard都正确地猜测问题出在Json数据格式中。谢谢
Name: Polls
AntiForgery: false
Author: Matt
... removed for brevity 
Features:
    Polls
... etc