使用删除链接删除对象时如何包含 @Html.AntiForgeryToken()
Posted
技术标签:
【中文标题】使用删除链接删除对象时如何包含 @Html.AntiForgeryToken()【英文标题】:How to include the @Html.AntiForgeryToken() when deleting an object using a Delete link 【发布时间】:2012-05-03 15:26:08 【问题描述】:我有以下ajax.actionlink
调用Delete action method
来删除对象:-
@if (!item.IsAlreadyAssigned(item.LabTestID))
string i = "Are You sure You want to delete (" + @item.Description.ToString() + ") ?";
@Ajax.ActionLink("Delete",
"Delete", "LabTest",
new id = item.LabTestID ,
new AjaxOptions
Confirm = i,
HttpMethod = "Post",
OnSuccess = "deletionconfirmation",
OnFailure = "deletionerror"
)
但是有没有办法在 Ajax.actionlink
删除调用中包含 @html.AntiForgeryToken()
以确保没有攻击者可以发送虚假删除请求?
BR
【问题讨论】:
【参考方案1】:修改答案Bronx:
$.ajaxPrefilter(function (options, localOptions, jqXHR)
var token, tokenQuery;
if (options.type.toLowerCase() !== 'get')
token = GetAntiForgeryToken();
if (options.data.indexOf(token.name)===-1)
tokenQuery = token.name + '=' + token.value;
options.data = options.data ? (options.data + '&' + tokenQuery)
: tokenQuery;
);
结合Jon White的这个答案
function GetAntiForgeryToken()
var tokenField = $("input[type='hidden'][name$='RequestVerificationToken']");
if (tokenField.length == 0) return null;
else
return
name: tokenField[0].name,
value: tokenField[0].value
;
编辑 抱歉 - 意识到我在这里重新发明***SO asp-net-mvc-antiforgerytoken-over-ajax/16495855#16495855
【讨论】:
【参考方案2】:您需要使用Html.AntiForgeryToken
帮助器来设置cookie 并发出具有相同值的隐藏字段。发送 AJAX 请求时,您还需要将此值添加到 POST 数据中。
所以我会使用普通链接而不是 Ajax 链接:
@Html.ActionLink(
"Delete",
"Delete",
"LabTest",
new
id = item.LabTestID
,
new
@class = "delete",
data_confirm = "Are You sure You want to delete (" + item.Description.ToString() + ") ?"
)
然后将隐藏字段放在 DOM 中的某个位置(例如在结束 body 标记之前):
@Html.AntiForgeryToken()
最后以不显眼的 AJAXify 删除锚点:
$(function ()
$('.delete').click(function ()
if (!confirm($(this).data('confirm')))
return false;
var token = $(':input:hidden[name*="RequestVerificationToken"]');
var data = ;
data[token.attr('name')] = token.val();
$.ajax(
url: this.href,
type: 'POST',
data: data,
success: function (result)
,
error: function ()
);
return false;
);
);
现在您可以使用 ValidateAntiForgeryToken
属性来装饰您的 Delete
操作:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Delete(int id)
...
【讨论】:
感谢您的回复,所以没有办法在原来的 Ajax.Actionlink 中定义这个?。 我还有第二个担心,关于为什么互联网上的所有示例只在编辑和创建场景中使用防伪令牌(而不是在删除场景中),而我没有看到任何教程在删除场景中使用了防伪令牌,所以有必要这样做(我认为我们应该这样做!!!)以上是关于使用删除链接删除对象时如何包含 @Html.AntiForgeryToken()的主要内容,如果未能解决你的问题,请参考以下文章
从 C# 添加新行时如何在 GridView 中添加删除链接?