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