2012-04-23 5 views
13

ho il seguente ajax.actionlink che richiede un Delete action method per l'eliminazione di un oggetto: -Come includere l'@ Html.AntiForgeryToken() durante l'eliminazione di un oggetto utilizzando un collegamento Elimina

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

, ma c'è un modo per includere @Html.AntiForgeryToken() con la chiamata di eliminazione Ajax.actionlink per assicurarsi che nessun utente malintenzionato possa inviare una richiesta di eliminazione non valida?

BR

risposta

16

È necessario utilizzare il Html.AntiForgeryToken helper, che imposta un cookie ed emette un campo nascosto con lo stesso valore. Quando si invia la richiesta AJAX è necessario aggiungere questo valore anche ai dati POST.

quindi vorrei usare un normale collegamento al posto di un collegamento 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() + ") ?" 
    } 
) 

e poi mettere il campo nascosto da qualche parte nel DOM (ad esempio prima del tag body di chiusura):

@Html.AntiForgeryToken() 

e infine discretamente AJAXify l'ancora di eliminazione:

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

Ora si potrebbe decorare la vostra Delete azione con l'attributo ValidateAntiForgeryToken:

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

grazie per la risposta ,, quindi non c'è modo di definire questo nel Ajax.Actionlink originale ?. –

+0

E ho una seconda preoccupazione, sul perché tutti gli esempi su Internet utilizzano il token antiforgery solo nella modifica e creano scenari (non nello scenario di eliminazione), mentre non ho visto alcun tutorial che utilizza il token antiforgery nell'eliminazione scenario, quindi è necessario farlo (penso che dovremmo farlo !!!) –

2

Modifica la risposta 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; 
     } 
    } 
}); 

combinato con questa risposta da 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 
    }; 
} 

Modifica dispiace - realizzato io sono re-inventare la ruota qui SO asp-net-mvc-antiforgerytoken-over-ajax/16495855#16495855