la richiesta supera il maxQueryStringLength configurato quando si utilizza [Authorize]


122

inserisci qui la descrizione dell'immagine
Ho un sito MVC3 in C #, ho una vista particolare che riceve parametri di query da una funzione JavaScript, la funzione reindirizza al sito tramite

window.location.href = "../ActionName?" + query_string;

query_string è la stringa dei parametri di query dinamici creata dalla funzione JavaScript.

La ragione di questa stranezza è che a volte la stessa funzione passa l'URL a un webform ASP.Net a causa di dover utilizzare il controllo reportviewer , l'azione alternativa è salvare alcuni parametri in questo caso passa alla visualizzazione. (Può elaborare di più se ciò non ha senso)

Il tutto funziona bene fino a quando non introduco [Autorizza] al metodo di azione. Si interrompe se è a posto, funziona senza problemi e [Autorizza] funziona bene su tutti gli altri metodi.

L'intero URL in questo caso è lungo 966 caratteri, dopo la ricerca sembra che il valore maxQueryStringLength sia 2048 per impostazione predefinita ma può essere sovrascritto da qualsiasi valore di tipo intero, quindi solo per i sorrisi ho aggiunto il

<security>
  <requestFiltering>
    <requestLimits maxQueryString="2048"></requestLimits>
  </requestFiltering>
</security>

key al file di configurazione web sotto la chiave.

Nessuna gioia lì, quindi sono diventato ridicolo e ho fatto 4096, ancora nessuna gioia.

Ora con l'intero URL lungo 966 caratteri, l'attributo di autorizzazione non può aggiungere seriamente altri 1082-3130 caratteri, quindi come posso determinare qual è effettivamente l'errore o perché l'impostazione non ha effetto.

VS2010 Pro SP1


Aggiungi il messaggio di errore dettagliato che stai ricevendo.
counsellorben

Risposte:


70

Quando arriva una richiesta non autorizzata, l'intera richiesta viene codificata in URL e aggiunta come stringa di query alla richiesta del modulo di autorizzazione, in modo da poter vedere dove ciò potrebbe causare un problema data la tua situazione.

Secondo MSDN, l'elemento corretto da modificare per reimpostare maxQueryStringLength in web.config è l' <httpRuntime>elemento all'interno <system.web>dell'elemento, vedere elemento httpRuntime (schema delle impostazioni ASP.NET) . Prova a modificare quell'elemento.


1
Ahimè, metterlo nel posto giusto sembra essere il trucco, un intellisense abbastanza interessante mi guida alla stessa chiave nel luogo in cui originariamente l'ho pubblicato.
Sabre

8
Buono a sapersi è anche il valore massimo per questo parametro è 2097151 - all'inizio ho provato a usare Int32.MaxValue, ma l'eccezione che è stata lanciata in fase di esecuzione mi ha indicato di utilizzare un valore compreso tra 0 e 2097151.
TimDog


1
Credo che sebbene sia possibile impostare il valore massimo per questo parametro su 2097151, ci sono altri parametri che influiscono sulla lunghezza massima della query accettata. Avevo una stringa di query molto più corta di questo massimo che non è stata accettata: era lunga 3.393 caratteri. Un'altra query di 3.200 caratteri ha funzionato bene.
markthewizard1234

@ markthewizard1234: D'accordo: ho aumentato il mio da 2048 a 4096. Ciò ha avuto qualche effetto, poiché il messaggio di errore originale con 404.something per la stringa di query troppo lunga non viene più visualizzato. Ma ora, viene restituito un altro messaggio di errore con codice 400, che indica anche una stringa di query troppo lunga.
OPPURE Mapper

213

Nella radice web.configdel tuo progetto, sotto il system.webnodo:

<system.web>
    <httpRuntime maxUrlLength="10999" maxQueryStringLength="2097151" />
...

Inoltre, ho dovuto aggiungerlo sotto il system.webServernodo o ho ricevuto un errore di sicurezza per le mie lunghe stringhe di query:

<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxUrl="10999" maxQueryString="2097151" />
      </requestFiltering>
    </security>
...

1
L'apertura di questo elemento crea gravi falle di sicurezza? Quali aspetti negativi ci sono nell'impostare maxurl e maxquery su 2097151?
Brian

1
Brian, questa è una bella domanda: non riesco a vedere alcun difetto di sicurezza a meno che in qualche modo inserire qualcosa di più lungo nella stringa di query oltre al limite del browser possa essere dannoso. Le stringhe di query della lunghezza massima del browser hanno la precedenza su questo valore è un'altra domanda a cui non ho la risposta. Grazie per avermelo chiesto, forse qualcuno qui può fare più luce su questo.
theJerm

Immagino che ci sia una potenziale vulnerabilità DOS, ma dipende da come gestisci effettivamente la richiesta. Mi sono imbattuto in questo mentre cercavo di aggiungere 100 utenti in una richiesta. Non è qualcosa che voglio che accada comunque.
Martin

4
Questo ha risolto immediatamente il mio problema, poiché avevo lo stesso problema su un progetto MVC 4. L'aggiunta di entrambi i precedenti ha risolto il mio errore. Grazie mille!!
Ed DeGagne

3
Tieni presente che maxQueryStringè la lunghezza in byte come uint con un valore massimo di 4294967295 ed maxQueryStringLengthè la lunghezza in caratteri come int ma con un intervallo di 0-2097151.
marsze

5

Per chiunque altro possa incontrare questo problema e non è risolto da nessuna delle opzioni sopra, questo è ciò che ha funzionato per me.

1. Click on the website in IIS
2. Double Click on Authentication under IIS
3. Enable Anonymous Authentication

L'avevo disabilitato perché stavamo usando la nostra Auth, ma questo ha portato a questo stesso problema e la risposta accettata non ha aiutato in alcun modo.


4

ho questo errore usando datatables.net

ho corretto la modifica del valore predefinito ajax Get to POST nelle proprietà di DataTable ()

"ajax": {
        "url": "../ControllerName/MethodJson",
        "type": "POST"
    },

Stavo usando anche i datatables e, dopo aver provato senza successo i suggerimenti sopra, questo trucco ha funzionato.
AidaM
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.