【问题标题】:How to include the @Html.AntiForgeryToken() when deleting an object using a Delete link使用删除链接删除对象时如何包含 @Html.AntiForgeryToken()
【发布时间】: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

【问题讨论】:

    标签: asp.net-mvc-3 antiforgerytoken


    【解决方案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 中定义这个?。
      • 我还有第二个担心,关于为什么互联网上的所有示例只在编辑和创建场景中使用防伪令牌(而不是在删除场景中),而我没有看到任何教程在删除场景中使用了防伪令牌,所以有必要这样做(我认为我们应该这样做!!!)
      猜你喜欢
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      相关资源
      最近更新 更多