ValidateAntiForgeryToken ajax
[ValidateAntiForgeryToken]
为防止CSRF,asp.net core会在form中自动注入一个隐藏域防止攻击
自动加入:
<form asp-action="create">
</form>
或者使用beginform自动加入隐藏域
@using (Html.BeginForm("ChangePassword", "Manage")) { ... }
或手动加入:
<form method="post" action="create">
@Html.AntiForgeryToken()
</form>
隐藏域代码大致如下:
<input name="__RequestVerificationToken" type="hidden" value="CfDJ8NrAkS ... s2-m9Yw">
在asp.net或asp.net core mvc中,对于删除操作,微软加了token,这样的好处是防止跨站攻击,但如果用平常的ajax删除操作执行时会返回500错误,因此需要加入token进行删除,核心代码实现如下
1
2
3
4
5
6
7
8
9
10
11
|
// POST: Schedules/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(long id)
{
Schedule schedule = dbcontext.Schedule.Find(id);
schedule.U_User.Clear();
dbcontext.Schedule.Remove(schedule);
dbcontext.SaveChanges();
return RedirectToAction("Index", "Admin");
}
|
以下是两种方法实现均可,url根据自己情况填写:
第一种:将token加到form里和数据一起提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
$(".del").click(function () {
//$('#myModal').modal('show');
if (confirm("确定删除吗")) {
var data = {};
var token = $('@Html.AntiForgeryToken()').val();
data["__RequestVerificationToken"] = token;
url = $(this).attr("data-href");
//console.log(url,token,data);
$.ajax({
url: url,
type: "post",
data: data,
success: function (e) {
window.location.reload();
}
})
return true;
}
else { return false; }
});
|
第二种方法加到headers里,在头标识中加入:url可根据自己情况修改
推荐使用此方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
if (confirm("确定删除选中的记录吗")) {
$.ajax({
type: "POST",
url: "/@ViewContext.RouteData.Values["controller"]/Delete",
data: { ids: arrIds },
headers: { "RequestVerificationToken":$('@Html.AntiForgeryToken()').val()},
success: function (data, state) {
window.location = "@ViewContext.RouteData.Values["controller"]";
},
error: function (data, state) {
alert("操作失败")
}
});
}
|
微软官方参考:https://github.com/aspnet/AspNetCore.Docs/blob/master/aspnetcore/security/anti-request-forgery/sample/MvcSample/Views/Home/Ajax.cshtml