2011-11-09 1 views
5

Abbiamo un sito Web che utilizza MVC3 e un metodo di autenticazione personalizzato che non si basa affatto sull'autenticazione dei moduli, almeno da quello che posso dire. Nel web.config abbiamo impostatoAntiForgeryToken senza autenticazione moduli

<authentication mode="None"></authentication> 

e non usiamo mai/set HttpContext.User ovunque nel codice. Il problema è quando si utilizza @ Html.AntiForgeryToken() in alcuni casi, l'utente riceve questo messaggio di errore:

A required anti-forgery token was not supplied or was invalid 

Centralizziamo tutti i controlli anti-contraffazione in OnAuthorization con questo codice:

if (String.Compare(filterContext.HttpContext.Request.HttpMethod, "post", true) == 0) 
{ 
    var forgery = new ValidateAntiForgeryTokenAttribute(); 
    forgery.OnAuthorization(filterContext); 
} 

Questo è dove si verifica l'eccezione. Abbiamo defined a machineKey in web.config per impedire la generazione di nuove chiavi durante il riciclo del pool di applicazioni. Questo non risolve il problema.

Successivamente abbiamo pensato che forse il browser del cliente non sta inviando i cookie. Abbiamo iniziato a registrare i cookie e abbiamo notato che in alcuni casi viene inviato il cookie RequestVerificationToken_Lw, ma in altri non lo è, anche se altri cookie, come quelli creati da Google Analytics, vengono inviati correttamente. Potrebbe esserci qualcosa nel browser che sta eliminando alcuni cookie e lasciandone altri?

Sembra lo anti-forgery token depends on forms authentication. È questo il caso? Un modo per continuare a utilizzare AntiForgeryToken quando non si utilizza l'autenticazione dei moduli in modo affidabile. Tieni presente che il metodo descritto sopra funziona per oltre il 90% dei casi, ma non possiamo individuare perché non funziona per alcune persone.

Pensieri?
Grazie!

+0

Perché preoccuparsi dei token anti contraffazione se non si utilizza alcuna autenticazione? Lo scopo di un attacco CSRF è che un utente malintenzionato esegua azioni per conto di un utente autenticato su un sito. E se un sito non usa l'autenticazione CSRF sembra privo di scopo. –

+0

Sto usando l'autenticazione, non solo l'autenticazione dei moduli. – pbz

+0

che tipo di autenticazione stai usando? –

risposta

0

Alcuni utenti hanno questo problema tutto il tempo? O solo un po 'di tempo? Inoltre, funziona per alcuni dei metodi TUTTO il tempo o è incoerente per lo stesso metodo di azione? Hai qualche chiamata Ajax? L'implementazione del token anti-contraffazione predefinito non gestisce le chiamate AJAX. Ma puoi scrivere del codice personalizzato per farlo funzionare

+0

non so perché questo è apparso come una risposta e non un commento –

+0

Grazie per la risposta! 1) Alcuni utenti sembrano averlo sempre, ma l'unico utente con cui sono riuscito a entrare in contatto è un po 'non tecnico, quindi non ho potuto indagare troppo. Vedo il loro IP e l'errore nel registro, quindi so che è legittimo. 2) Nessuna chiamata AJAX su quelle pagine. Sono consapevole di queste limitazioni e ho lavorato in base alle necessità. – pbz

0

Stai aggiungendo il token antiforaio all'interno del modulo? Il token antiforgery è memorizzato sul client tramite un elemento HTML nascosto, quindi non come cookie. L'altra domanda sarebbe quale versione del browser stanno usando? È possibile aggiornare al più tardi?

@using (Html.BeginForm()) 
    { 
     @Html.AntiForgeryToken()... 
+0

Sì, includo il token all'interno del modulo. Non so quale versione stiano usando, ma usano Internet Explorer (secondo l'unica persona che ho potuto contattare). Questo è successo ad altre persone, ma sfortunatamente non ho registrato la versione del browser.Potrei dover tornare indietro e registrare il più possibile per ottenere più dati. Speravo che altri si imbattessero in questo problema prima. – pbz