Il campo modulo anti-contraffazione richiesto "__RequestVerificationToken" non è presente Errore nella registrazione dell'utente


141

Sto usando Membership.createla funzione utente, quindi si sta verificando il seguente errore,

Il campo modulo anti-contraffazione richiesto "__RequestVerificationToken" non è presente

Come posso risolvere questo problema?

Risposte:


218

Hai un [ValidateAntiForgeryToken]attributo prima della tua azione. È inoltre necessario aggiungere @Html.AntiForgeryToken()nel modulo.


11
Ho una pagina web che ha lo stesso problema ma tutto è corretto. qual è l'errore?
Condotto dal

@ConductedClever Dovresti controllare attentamente tutto (campi, cookie) con fiddler e / o firebug (qualsiasi strumento di sviluppo del browser), guarda questo articolo: asp.net/web-api/overview/security/…
webdeveloper

@ConducedClever anche me. Funziona, ma raramente viene visualizzato questo errore e non ho idea del PERCHÉ?
QMaster il

Ho tutto ok, nei miei test funziona, sulla macchina di un client ha funzionato fino a poco tempo fa, ma ora dà questo errore. Non ho idea del perché. Qualcuno ha idee diverse da quelle elencate per favore?
Andrei Dobrin,

1
Html.AntiForgeryToken();non funziona !! Trasformarsi in @Html.AntiForgeryToken()opere
FindOutIslamNow

78

Nel mio caso, avevo questo nel mio web.config:

<httpCookies requireSSL="true" />

Ma il mio progetto era impostato per non utilizzare SSL. Commentando quella riga o impostando il progetto in modo da utilizzare sempre SSL, l'ho risolto.


3
Nel mio caso web.config aveva richiesto SSL ma c'erano collegamenti IIS per entrambe le porte 80 e 443, quindi gli utenti che digitavano https stavano ottenendo il comportamento corretto e gli utenti che digitavano http stavano ottenendo questo errore, inserendo una regola di riscrittura per forzare tutto su https: / / {HTTP_HOST} / {R: 1} risolto il problema
user1069816

Grazie 😃 Nel mio caso IISc'era questo binding ( https » EmptyHostName » IP » 443) ma non c'era un binding per ( https » www.mysite.com » IP » 443). Quindi ho aggiunto una nuova associazione con un nome host non vuoto perché httpsera uguale al dominio e ha risolto il problema. Ho IISforzato la riscrittura delle impostazioni http 2 https.
RAM,

61

Come questo:

Il controller

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
     ...
     Code Block
     ...
}

La vista:

@using(Html.BeginForm())
{
     @Html.AntiForgeryToken()
     <input name="..." type="text" />
     // rest
}

Prova a utilizzare solo in HTML
Subrata Sarkar,

41

Assicurarsi inoltre di non utilizzare [ValidateAntiForgeryToken] in [HttpGet].

  [HttpGet]
  public ActionResult MethodName()
  {
  ..
  }

1
Questa risposta ha integrato gli altri e risolto il mio problema! Grazie
Lucas il

1
Questa risposta presuppone che non stai salvando alcun dato inviato (che non dovresti essere su un HttpGet). In tal caso, è comunque necessaria la protezione XSRF fornita da [ValidateAntiForgeryToken].
entro il

9

Riceverai l'errore anche quando i cookie non sono abilitati.


2
Bel colpo. Stavo usando Internet Explorer. L'utilizzo del browser Chrome ha risolto il problema per me
FindOutIslamNow

Anche questo ha risolto il mio problema. abilitazione dei cookie su Google Chrome. Grazie
Il metodo scientifico

7

Un'altra cosa che può causare questo (appena incontrato questo) è la seguente: se per qualche motivo disabiliti tutti i campi di input nel tuo modulo. disabiliterà il campo di input nascosto che contiene il token di verifica. quando il modulo verrà registrato, il valore del token mancherà e genererà l'errore che manca. quindi quello che devi fare è riattivare il campo di input che contiene il token di verifica e tutto andrà bene.


6

Un'altra possibilità per quelli di noi che caricano file come parte della richiesta. Se la lunghezza del contenuto supera <httpRuntime maxRequestLength="size in kilo bytes" /> e si stanno utilizzando i token di verifica della richiesta, il browser visualizza il 'The required anti-forgery form field "__RequestVerificationToken" is not present'messaggio anziché il messaggio di superamento della lunghezza della richiesta.

L'impostazione di maxRequestLength su un valore abbastanza grande da soddisfare la richiesta risolve il problema immediato, anche se ammetto che non è una soluzione adeguata (vogliamo che l'utente conosca il vero problema della dimensione del file, non quello dei token di verifica della richiesta mancanti).


5

Assicurati di avere l'attributo http nel controller come:

[HttpPost]

aggiungi anche l'attributo nel controller:

[ValidateAntiForgeryToken]

Nel tuo modulo a tuo avviso devi scrivere:

@Html.AntiForgeryToken();

Ho avuto Html.AntiForgeryToken (); senza il segno @ mentre era in un blocco di codice, non ha dato un errore in Razor ma lo ha fatto in fase di esecuzione. Assicurati di guardare il segno @ di @ Html.Ant .. se manca o no


5

Nel mio caso, avevo questo javascript nel modulo di invio:

$('form').submit(function () {
    $('input').prop('disabled', true);
});

Ciò stava rimuovendo il RequestVerificationToken nascosto dal modulo da inviare. L'ho cambiato in:

$('form').submit(function () {
    $('input[type=submit]').prop('disabled', true);
    $('input[type=text]').prop('readonly', true);
    $('input[type=password]').prop('readonly', true);
});

... e ha funzionato bene.


In che modo hai notato che l'anti chiave è stata influenzata quando hai disabilitato gli input?
Cer

1
@Cer - se mi stai chiedendo come ho notato, ho controllato la richiesta con il violinista e ho scoperto che la chiave non veniva inviata. Ho letto che Html invia non includerà i controlli disabilitati. Quindi l'ho cambiato readonlyed escluso i controlli nascosti. Sembra funzionare bene.
Sean

3

Se qualcuno riscontra l'errore per lo stesso motivo per cui lo provo, ecco la mia soluzione:

se tu avessi Html.AntiForgeryToken();

cambiarlo in @Html.AntiForgeryToken()


2

Nel mio caso il motivo non era un dominio errato in web.config per i cookie:

<httpCookies domain=".wrong.domain.com" />

yeep! se sul computer locale digita <httpCookies domain = "localhost" /> funzionerà solo sui cookie del computer locale e se provi ad aprire il tuo sito su un'altra macchina inserirai l'ip (fe 192.168.1.43) che non funzionerà perché cercando "localhost"
user3419036

2

Nel mio caso è stato a causa di aggiunta requireSSL=truea httpcookiesin WebConfig che ha reso la fermata di lavoro AntiForgeryToken. Esempio:

<system.web>
  <httpCookies httpOnlyCookies="true" requireSSL="true"/>
</system.web>

Per fare entrambe le cose requireSSL=truee @Html.AntiForgeryToken()lavorare ho aggiunto questa riga all'interno di Application_BeginRequestinGlobal.asax

    protected void Application_BeginRequest(object sender, EventArgs e)
  {
    AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
  }

2

Ottenuto questo errore in Chrome con login predefinito per ASP.NET con account utente individuali

.cshtml:

@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    @Html.AntiForgeryToken()
    <h4>Use a local account to log in.</h4>

controller:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)

Risolto cancellando i dati del sito per il sito:

inserisci qui la descrizione dell'immagine


Ok ha funzionato. Ma questo succede ancora e ancora. In Firefox lo stesso progetto funziona correttamente. Cosa posso fare?
Può Ürek il

@ CanÜrek Hai diversi progetti / siti con lo stesso dominio? Ex localhost, app.site.com e app2.site.com ecc? Di solito succede per questo.
Ogglas,

0

Nella mia soluzione EPiServer su diversi controller c'era un attributo ContentOutputCache sull'azione Index che accettava HttpGet. Ogni vista per quelle azioni conteneva un modulo che stava pubblicando un'azione HttpPost sullo stesso controller o su uno diverso. Non appena ho rimosso quell'attributo da tutti quei problemi relativi alle azioni sull'indice, non c'era più.


0

Perché questo viene fuori con la prima ricerca di questo:

Ho avuto questo problema solo in Internet Explorer e non sono riuscito a capire quale fosse il problema. Per farla breve, non stava salvando la porzione di cookie del token perché il nostro (sotto) dominio aveva un carattere di sottolineatura. Ha funzionato in Chrome ma IE / Edge non mi è piaciuto.


0

Anche tutte le altre risposte qui sono valide, ma se nessuna di esse risolve il problema vale la pena verificare che le intestazioni effettive vengano passate al server.

Ad esempio, in un ambiente con carico bilanciato dietro nginx, la configurazione predefinita prevede lo striping dell'intestazione __RequestVerificationToken prima di passare la richiesta al server, vedere: il proxy inverso nginx semplice sembra eliminare alcune intestazioni


0

A volte stai scrivendo un metodo di azione modulo con un elenco di risultati. In questo caso, non è possibile lavorare con un metodo di azione. Quindi devi avere due metodi di azione con lo stesso nome. Uno con [HttpGet]e un altro con[HttpPost] attributo.

Nel tuo [HttpPost]metodo di azione, imposta l' [ValidateAntiForgeryToken]attributo e inserisci anche @Html.AntiForgeryToken()il modulo html.


0

Nel mio caso stavo ricevendo questo errore mentre scrivevo un post AJAX, si è scoperto che il valore __RequestVerificationToken non veniva trasmesso nella chiamata. Ho dovuto trovare manualmente il valore di questo campo e impostarlo come proprietà sull'oggetto dati inviato all'endpoint.

vale a dire data.__RequestVerificationToken = $('input[name="__RequestVerificationToken"]').val();


Esempio

HTML

  <form id="myForm">
    @Html.AntiForgeryToken()

    <!-- other input fields -->

    <input type="submit" class="submitButton" value="Submit" />
  </form>

Javascript

$(document).on('click', '#myForm .submitButton', function () {
  var myData = { ... };
  myData.__RequestVerificationToken = $('#myForm input[name="__RequestVerificationToken"]').val();

  $.ajax({
    type: 'POST',
    url: myUrl,
    data: myData,
    contentType: 'application/x-www-form-urlencoded; charset=utf-8',
    dataType: 'json',
    success: function (response) {
      alert('Form submitted');
    },
    error: function (e) {
      console.error('Error submitting form', e);
      alert('Error submitting form');
    },
  });
  return false; //prevent form reload
});

controllore

    [HttpPost]
    [Route("myUrl")]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> MyUrlAsync(MyDto dto)
    {
        ...
    }

In effetti, se definirai la struttura della tua classe MyDto, sarà molto utile
Chandan Kumar,

Beh, non sono sicuro che in realtà sarà molto utile e il codice di esempio è ormai scomparso, quindi diciamopublic class MyDto { public bool Whatever { get; set; } }
demoncodemonkey

-1

mi piacerebbe condividere il mio, ho seguito questo tutorial anti forgerytoken usando asp.net mvc 4 con angularjs, ma genera un'eccezione ogni volta che chiedo di usare $ http.post e ho capito che la soluzione è semplicemente aggiungere 'X- Richiesto-Con ':' XMLHttpRequest ' alle intestazioni di $ http.post, perché sembra che il(filterContext.HttpContext.Request.IsAjaxRequest()) non lo riconosca come ajax ed ecco il mio codice di esempio.

App.js

var headers = { 'X-Requested-With': 'XMLHttpRequest', 'RequestVerificationToken': $scope.token, 'Content-Type': 'application/json; charset=utf-8;' };

$http({ method: 'POST', url: baseURL + 'Save/User', data: JSON.stringify($scope.formData), headers: headers }).then(function (values) { alert(values.data); }).catch(function (err) { console.log(err.data); });


SaveController

[HttpPost] [MyValidateAntiForgeryToken] public ActionResult User(UserModel usermodel) { ....

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.