Asp.net mvc 3 如何通过Ajax post防止跨站点请求伪造?
我在Mvc项目中有一个带有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),但
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
});