Die Anforderung überschreitet die konfigurierte maxQueryStringLength, wenn [Authorize] verwendet wird.

121

Geben Sie hier die Bildbeschreibung ein
Ich habe eine MVC3-Site in C #. Ich habe eine bestimmte Ansicht, die Abfrageparameter von einer JavaScript-Funktion erhält. Die Funktion leitet über zur Site weiter

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

query_string ist die dynamische Abfrageparameterzeichenfolge, die von der JavaScript-Funktion erstellt wird.

Der Grund für diese Verrücktheit ist, dass manchmal dieselbe Funktion die URL an ein ASP.Net-Webformular übergibt, da es das Reportviewer- Steuerelement verwenden muss. Die alternative Aktion besteht darin, einige Parameter zu speichern, in diesem Fall wird sie an die Ansicht übergeben. (Kann mehr ausarbeiten, wenn das keinen Sinn ergibt)

Das Ganze funktioniert einwandfrei, bis ich [Authorize] in die Aktionsmethode einführe. Bricht ab, wenn es vorhanden ist, funktioniert ohne ohne und [Autorisieren] funktioniert gut mit allen anderen Methoden.

Die gesamte URL ist in diesem Fall 966 Zeichen lang. Nach Recherchen scheint der maxQueryStringLength- Wert standardmäßig 2048 zu sein, kann jedoch auf einen beliebigen Wert vom Typ Integer überschrieben werden. Daher habe ich nur für Grinsen den Wert hinzugefügt

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

Schlüssel zur Webkonfigurationsdatei unter dem Schlüssel.

Keine Freude dort, also wurde ich lächerlich und machte es 4096, immer noch keine Freude.

Da die gesamte URL 966 Zeichen lang ist, kann das Autorisierungsattribut nicht ernsthaft weitere 1082-3130 Zeichen hinzufügen. Wie kann ich also feststellen, was der Fehler tatsächlich ist oder warum die Einstellung nicht wirksam wird?

VS2010 Pro SP1

Säbel
quelle
Bitte fügen Sie die detaillierte Fehlermeldung hinzu, die Sie erhalten.
Counsellorben

Antworten:

70

Wenn eine nicht autorisierte Anfrage eingeht, wird die gesamte Anfrage URL-codiert und als Abfragezeichenfolge zur Anfrage zum Autorisierungsformular hinzugefügt, sodass ich sehen kann, wo dies in Ihrer Situation zu einem Problem führen kann.

Laut MSDN ist das richtige Element zum Ändern zum Zurücksetzen von maxQueryStringLength in web.config das <httpRuntime>Element innerhalb des <system.web>Elements, siehe httpRuntime-Element (ASP.NET-Einstellungsschema) . Versuchen Sie, dieses Element zu ändern.

Counsellorben
quelle
1
Leider scheint es der Trick zu sein, es an der richtigen Stelle zu platzieren. Interessant genug Intellisense führt mich zu demselben Schlüssel an der Stelle, an der ich es ursprünglich gepostet habe.
Sabre
8
Gut zu wissen ist auch, dass der Maximalwert für diesen Parameter 2097151 ist - zuerst habe ich versucht, den Int32.MaxValue zu verwenden, aber die zur Laufzeit ausgelöste Ausnahme hat mich veranlasst, einen Wert zwischen 0 und 2097151 zu verwenden.
TimDog
funktioniert nicht siehe das. stackoverflow.com/questions/31624710/…
Jitendra Pancholi
1
Ich glaube, obwohl Sie den Maximalwert für diesen Parameter auf 2097151 setzen können, gibt es andere Parameter, die sich auf die maximal akzeptierte Abfragelänge auswirken. Ich hatte eine Abfragezeichenfolge, die viel kürzer als dieses Maximum war und nicht akzeptiert wurde - sie war 3.393 Zeichen lang. Eine andere Abfrage mit 3.200 Zeichen funktionierte einwandfrei.
markthewizard1234
@ markthewizard1234: Einverstanden: Ich habe meine von 2048 auf 4096 erhöht. Dies hat einige Auswirkungen gehabt, da die ursprüngliche Fehlermeldung mit 404 angezeigt wird. Etwas für die überlange Abfragezeichenfolge wird nicht mehr angezeigt. Jetzt wird jedoch eine weitere Fehlermeldung mit dem Code 400 zurückgegeben, die ebenfalls eine überlange Abfragezeichenfolge angibt.
ODER Mapper
212

Im Stammverzeichnis web.configIhres Projekts unter dem system.webKnoten:

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

Außerdem musste ich dies unter dem system.webServerKnoten hinzufügen, oder es wurde ein Sicherheitsfehler für meine langen Abfragezeichenfolgen angezeigt:

<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxUrl="10999" maxQueryString="2097151" />
      </requestFiltering>
    </security>
...
theJerm
quelle
1
Verursacht das Öffnen schwerwiegende Sicherheitslücken? Welche Nachteile hat das Setzen von maxurl und maxquery auf 2097151?
Brian
1
Brian, das ist eine gute Frage - ich kann keine Sicherheitslücken erkennen, es sei denn, es kann schädlich sein, etwas längeres in die Abfragezeichenfolge als ein Browser-Limit einzufügen. Haben Abfragezeichenfolgen mit maximaler Länge des Browsers Vorrang vor diesem Wert? Dies ist eine weitere Frage, auf die ich keine Antwort habe. Vielen Dank für Ihre Frage, vielleicht kann jemand hier mehr Licht ins Dunkel bringen.
TheJerm
Ich denke, es gibt eine potenzielle DOS-Sicherheitslücke, aber das hängt davon ab, wie Sie die Anfrage tatsächlich behandeln. Ich bin darauf gestoßen, als ich versucht habe, 100 Benutzer in einer Anfrage hinzuzufügen. Ich möchte sowieso nichts passieren.
Martin
4
Dadurch wurde mein Problem sofort behoben, da ich das gleiche Problem bei einem MVC 4-Projekt hatte. Das Hinzufügen der beiden oben genannten Punkte hat meinen Fehler behoben. Ich danke dir sehr!!
Ed DeGagne
3
Beachten Sie, dass dies maxQueryStringdie Länge in Bytes als uint mit einem Maximalwert von 4294967295 und maxQueryStringLengthdie Länge in Zeichen als int, jedoch mit einem Bereich von 0-2097151 ist.
Marsze
5

Für alle anderen, die auf dieses Problem stoßen und es durch keine der oben genannten Optionen gelöst wird, hat dies für mich funktioniert.

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

Ich hatte dies deaktiviert, weil wir unsere eigene Authentifizierung verwendeten, aber das führte zu demselben Problem und die akzeptierte Antwort half in keiner Weise.

dball
quelle
4

Ich habe diesen Fehler mit datatables.net

Ich habe das Ändern des Standard-Ajax behoben. Get to POST in den Eigenschaften der DataTable ()

"ajax": {
        "url": "../ControllerName/MethodJson",
        "type": "POST"
    },
elblogdelbeto
quelle
Ich habe auch Datentabellen verwendet, und nachdem ich die obigen Vorschläge erfolglos ausprobiert hatte, hat dieser Trick es geschafft.
AidaM