如何通过Ajax发布阻止跨站点请求伪造?

时间:2013-04-03 06:35:58

标签: asp.net-mvc-3

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

进入确认页面。在具有隐藏表单的两个按钮的确认中,这将在上面的上一个中进行相同的Post操作。我在这两个隐藏的表单中添加了Html.Antiforgerytoken()。单击按钮时,我们不需要Form Post [页面重新加载],而不是使用此Ajax帖子。

我尝试过使用Ajax帖子(使用Antiforgerytoken),但它没有点击Post动作。显示404错误。

您能否建议如何使用Ajax帖子启用AntiforgryToken?对于什么类型的代码处理以及它在哪里添加?

表格详情:

 <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>  

Ajax Post:

$.ajax({     
    url: url,
    type: 'POST',
    data: JSON.stringify(Formdatas),
    contentType: 'application/json; charset=utf-8',
    beforeSend: showLoadingGraphic(id),
    success: onSuccessfulPost
});

2 个答案:

答案 0 :(得分:1)

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

我猜你使用'URL'的Ajax调用不正确

答案 1 :(得分:0)

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

@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
});

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