Sto usando Membership.create
la funzione utente, quindi si sta verificando il seguente errore,
Il campo modulo anti-contraffazione richiesto "__RequestVerificationToken" non è presente
Come posso risolvere questo problema?
Sto usando Membership.create
la funzione utente, quindi si sta verificando il seguente errore,
Il campo modulo anti-contraffazione richiesto "__RequestVerificationToken" non è presente
Come posso risolvere questo problema?
Risposte:
Hai un [ValidateAntiForgeryToken]
attributo prima della tua azione. È inoltre necessario aggiungere @Html.AntiForgeryToken()
nel modulo.
Html.AntiForgeryToken();
non funziona !! Trasformarsi in @Html.AntiForgeryToken()
opere
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.
IIS
c'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é https
era uguale al dominio e ha risolto il problema. Ho IIS
forzato la riscrittura delle impostazioni http 2 https
.
Come questo:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
...
Code Block
...
}
@using(Html.BeginForm())
{
@Html.AntiForgeryToken()
<input name="..." type="text" />
// rest
}
Assicurarsi inoltre di non utilizzare [ValidateAntiForgeryToken] in [HttpGet].
[HttpGet]
public ActionResult MethodName()
{
..
}
Riceverai l'errore anche quando i cookie non sono abilitati.
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.
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).
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
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.
readonly
ed escluso i controlli nascosti. Sembra funzionare bene.
Nel mio caso il motivo non era un dominio errato in web.config per i cookie:
<httpCookies domain=".wrong.domain.com" />
Nel mio caso è stato a causa di aggiunta requireSSL=true
a httpcookies
in 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=true
e @Html.AntiForgeryToken()
lavorare ho aggiunto questa riga all'interno di Application_BeginRequest
inGlobal.asax
protected void Application_BeginRequest(object sender, EventArgs e)
{
AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
}
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:
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ù.
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.
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
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.
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();
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)
{
...
}
public class MyDto { public bool Whatever { get; set; } }
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)
{
....