使用删除链接删除对象时如何包含 @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 中添加删除链接?

更新和删除时如何在一个url链接中发送两个pk

删除父对象时如何删除由stream.flatMap创建的列表中的子对象?

如何删除 Laravel 分页响应的元对象中的链接?

领域链接对象和删除

如果已删除,如何从向量中删除对象