Asp.net mvc 3 如何通过Ajax post防止跨站点请求伪造?

Asp.net mvc 3 如何通过Ajax post防止跨站点请求伪造?,asp.net-mvc-3,Asp.net Mvc 3,我在Mvc项目中有一个带有AntiforgeryToken()值的表单。在提交表单时,它在MvC项目中使用相应的控制器Post操作ValidateAntiforgeryToken进行验证 它进入确认页面。在确认有两个隐藏表单的按钮中,这将转到前面的Post操作。我在这两个隐藏表单中添加了Html.Antiforgerytoken()。单击按钮时,我们不需要形成Post[page reload],而是使用Ajax Post 我尝试过使用Ajax post(使用Antiforgerytoken),但

我在Mvc项目中有一个带有
AntiforgeryToken()
值的表单。在提交表单时,它在MvC项目中使用相应的控制器Post操作
ValidateAntiforgeryToken
进行验证

它进入确认页面。在确认有两个隐藏表单的按钮中,这将转到前面的Post操作。我在这两个隐藏表单中添加了
Html.Antiforgerytoken()
。单击按钮时,我们不需要形成Post[page reload],而是使用Ajax Post

我尝试过使用Ajax post(使用
Antiforgerytoken
),但它没有达到post操作。显示404错误

您能否建议如何使用Ajax post启用
AntiforgyToken
?对于这一点,什么类型的代码句柄以及它在哪里添加

表单详细信息:

 <form  method="post" action="">
     @Html.AntiForgeryToken()
     <input type="hidden" name="Name" value="@downloadInfo.Name" />
     <input type="hidden" name="Company" value="@downloadInfo.Company" />
     <input type="hidden" name="Email" value="@downloadInfo.Email" />
     <input type="hidden" name="Phone" value="@downloadInfo.Phone" />
 </form>  

尝试按需要生成表单(使用Html.BeginForm帮助程序):


现在,antiforgery令牌和隐藏字段将正确发送到服务器。

如果您收到了404,但不是来自令牌,则表明您的URL或方法无效。 您将在ajax表单帖子中包含您的令牌,因此使用工具Fiddler查看请求的URL并首先修复该URL


我猜您使用“URL”的Ajax调用是不正确的

Hi Dimitrov,它工作得很好。但是你能解释一下删除Contentype:Json和Data:Json.stringfy(myformdata.serialize())的原因吗?该方法接受所有表单输入字段,并将它们格式化为
application/x-www-form-urlencoded
请求,这是在没有AJAX的情况下提交表单时的默认设置。因此,您不需要将contentType设置为
JSON
。嗨,Dimitrov,非常感谢您的帮助。在CSRF prevention中将javascript对象转换为Json符号[Json.stringfy]时,您能解释一下什么是回退吗?
Json.stringify
方法需要手动构建一个javascript对象。
.serialize()
方法接受所有表单输入字段,并为您完成这项工作。由于您已经拥有包含防伪令牌的隐藏字段,因此该字段将包含在请求中。使用
JSON.stringify
方法,您必须自己提取这个值,我甚至不确定服务器端助手是否理解它。
$.ajax({     
    url: url,
    type: 'POST',
    data: JSON.stringify(Formdatas),
    contentType: 'application/json; charset=utf-8',
    beforeSend: showLoadingGraphic(id),
    success: onSuccessfulPost
});
@using (Html.BeginForm("SomeAction", "SomeController", FormMethod.Post, new { id = "myForm" }))
{
    @Html.AntiForgeryToken()
    <input type="hidden" name="Name" value="@downloadInfo.Name" />
    <input type="hidden" name="Company" value="@downloadInfo.Company" />
    <input type="hidden" name="Email" value="@downloadInfo.Email" />
    <input type="hidden" name="Phone" value="@downloadInfo.Phone" />
}
var myForm = $('#myForm');
$.ajax({     
    url: myForm.attr('action'),
    type: myForm.attr('method'),
    data: myForm.serialize(),
    beforeSend: showLoadingGraphic(id),
    success: onSuccessfulPost
});