2012-04-23 32 views
13

Mam następujący ajax.actionlink który wywołuje Delete action method do kasowania obiektu: -Jak zawierać @ Html.AntiForgeryToken() podczas usuwania obiektu przy użyciu link Usuń

@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" 
}) 
} 

ale czy jest jakiś sposób, aby dołączyć @Html.AntiForgeryToken() z usunięciem Ajax.actionlink, aby upewnić się, że żaden atakujący nie może wysłać fałszywego żądania usunięcia?

BR

Odpowiedz

16

Musisz użyć Html.AntiForgeryToken pomocnika, który ustawia plik cookie i emituje ukryte pole o tej samej wartości. Wysyłając żądanie AJAX, musisz również dodać tę wartość do danych POST.

Więc chciałbym użyć zwykłego linku zamiast linku 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() + ") ?" 
    } 
) 

a następnie umieścić pole ukryte gdzieś w DOM (na przykład przed znacznika body zamknięcia):

@Html.AntiForgeryToken() 

i wreszcie dyskretnie AJAXify usuwania kotwicy:

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

teraz można ozdobić swój Delete działanie z atrybutem ValidateAntiForgeryToken:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Delete(int id) 
{ 
    ... 
} 
+0

dzięki za odpowiedź ,, więc nie ma sposobu, aby to zdefiniować w oryginalnym Ajax.Actionlink ?. –

+0

Mam też drugą obawę, dlaczego wszystkie przykłady w Internecie używają tokena przeciw oszustwom w scenariuszach edycji i tworzenia (nie w scenariuszu usuwania), podczas gdy nie widziałem żadnego samouczka korzystającego z tokena przeciwdziałania w usuwaniu scenariusz, więc jest to konieczne (myślę, że powinniśmy to zrobić !!!) –

2

Modyfikowanie odpowiedź przez 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; 
     } 
    } 
}); 

połączeniu z tej odpowiedzi przez 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 
    }; 
} 

Edit przykro - zrealizowane Jestem Wymyślanie Koło tutaj SO asp-net-mvc-antiforgerytoken-over-ajax/16495855#16495855