8
votes

Asp.net mvc antiforgerytoken sur ajax

Je développe actuellement une application MVC dans ASP.NET. J'utilise Ajax.ActionLinkLink pour fournir un lien Supprimer dans une liste d'enregistrements, mais cela est très peu sûr. J'ai mis ceci: xxx pré>

sur la fonction pour faire la suppression, qui arrête la fonction appelée simplement par une URL. Cependant, l'autre trou de sécurité qui existe toujours est que si je devais créer une page HTML de base avec ce contenu: P>

<form action="http://foo.com/user/delete/260" method="post">
<input type="submit" />
</form>


0 commentaires

6 Réponses :


9
votes

Regardez sur ce Blog post .

dire que vous avez une méthode d'action comme Ceci:

[accepter lesverbs (httpverbs.post), Validateanttiforgerytoken] ActionSulte publique Deleteacount (int identifiant de compte) { // Supprimer des trucs}

Et vous l'appelez via:

$. Poste ('/ home / deleteacount', { CompteID: 1000}, fonction () { alerte ("compte supprimé"); });

Puisque le post n'inclut pas le Antiforgerytoken, ça échouera.

Heureusement, cela ne prend pas beaucoup Brainionne pour résoudre ce problème. Tout le client composant latéral de l'antiforgerytoken est fait le jeton dans une base champ caché. Donc, vous avez juste besoin de Tirez cette donnée et incluez-la dans votre appel AJAX.

var jeton = $ ('entrée [nom = __ requestverificationToken]'). val ();

$. Poste ('/ home / deleteacount', { CompteID: 1000, '__RequestverificationToken': jeton}, fonction() { alerte ("compte supprimé"); });

Notez que si vous avez plusieurs Formulaires sur la page avec plusieurs Antiforgerytokens, vous devrez Spécifiez lequel vous voulez dans votre Sélecteur JQuery. Un autre gotcha est si Vous utilisez JQuery's SERIALIZARRAY () Fonction, vous aurez Pour l'ajouter un peu différemment:

var formdata = $ ('# myform'). Serializarray (); varié jeton = $ ("entrée [nom = __ requestverificationToken] '). Val (); formdata.push ({Nom: '__RequestverificationToken', valeur: jeton});

$. poste ('/ home / deleteacount', formdata, fonction () { alerte ("compte supprimé"); });

mise à jour: le lien a été corrigé.


2 commentaires

Vous n'avez pas besoin de formdata.push ({nom: '__requestverificationToken', valeur: jeton}); Étant donné que Serializearray () retournera toutes les entrées sous la forme, qui incluent le champ caché __RequestverificationToke.


Oui, vous en avez besoin sur Ajax Posts (en utilisant actuellement MVC 4 et MS non obstrurlus ajax = jQuery) !!!



0
votes

Je n'ai utilisé aucun ajout d'ajaxe, mais je ne vois aucune raison pour laquelle vous ne pouvez pas utiliser un lien. Personnellement, j'utiliserais un gestionnaire d'événements surload pour créer de manière discrète un lien de la forme elle-même, puis retirez le formulaire.


0 commentaires

2
votes

Je ne connais pas l'ActionLink Ajax Spécifiquement, mais il est possible d'une page WebForms à poster sur une action MVC avec le [Acceptverbs.post (httpverbs.post), validateanttiforgeryToken] attributs. < / p>

Vous pouvez utiliser la réflexion pour obtenir les méthodes MVC utilisées pour définir la cookie et l'entrée de formulaire correspondante utilisée pour la validation MVC.

Voir cette réponse: L'utilisation d'un MVC HtmlHelper d'un WebForm


0 commentaires

6
votes

Vous pouvez utiliser AntiforgeryToken avec Ajax.ActionLink, mais vous devez insérer manuellement l'antiforgerytoken dans l'en-tête de votre demande, comme: xxx

alors, nous pouvons utiliser $ .ajaxprefilter pour l'insérer. dans l'en-tête: xxx

J'ai écrit un message à ce sujet ici . J'espère que cela vous aide!


1 commentaires

Cela envoie le jeton dans l'en-tête, mais le filtre [ValidAteantAnTIFORGeryToken] nécessite ceci dans les données de formulaire ...



6
votes

Utilisez AntiforgeryToken avec Ajax.ActionLink Link

En plus de JJwhite01 Réponse; Pour insérer le jeton dans les données de formulaire, utilisez option.data dans préfiltre xxx


1 commentaires

Le script Ajax non accidenté en MVC 4 inclut - options.data.push ({nom: "x-demandé-with", valeur: "xmlhttprequest"}) - alors vérifier et ajouter pour cela est maintenant inutile



0
votes

à piggyback sur le $. Ajaxprefilter CODE> Réponses, j'ai ajouté le jeton aux options code> code> et originaloptions code> plutôt que le JQXHR en-têtes. Cela nécessite que le jeton soit quelque part dans une forme sur votre page.

$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
    var token = $('input[name="__RequestVerificationToken"]');
    if (token.length > 0) {
        var data = options.data;
        var dataArray = originalOptions.data;
        if (data && !data.includes('__RequestVerificationToken')) {
            options.data = data + '&__RequestVerificationToken=' + token.val();
        }
        if (dataArray && !('__RequestVerificationToken' in dataArray)) {
            var tokenObject = { name: '__RequestVerificationToken', value: token.val() };
            originalOptions.data.push(tokenObject);
        }
    }
});


0 commentaires