14

ajax.actionlinkオブジェクトを削除するためにa を呼び出す次のものが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"
})
} 

しかし、攻撃者が誤った削除要求を送信できないようにするため@Html.AntiForgeryToken()に、削除呼び出しに含める方法はありますか?Ajax.actionlink

ブラジル

4

2 に答える 2

17

Html.AntiForgeryTokenCookieを設定し、同じ値の非表示フィールドを発行するヘルパーを使用する必要があります。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()

そして最後に、削除アンカーを目立たないようにAJAX化します。

$(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;
    });
});

Deleteこれで、アクションを次のValidateAntiForgeryToken属性で装飾できます。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Delete(int id)
{
    ...
}
于 2012-04-23T07:32:16.490 に答える
2

ブロンクスによる回答の変更:

$.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

于 2013-06-11T05:19:03.893 に答える