la demande dépasse la valeur maxQueryStringLength configurée lors de l'utilisation de [Authorize]

122

entrez la description de l'image ici
J'ai un site MVC3 en C #, j'ai une vue particulière étant alimenté par les paramètres de requête d'une fonction JavaScript, la fonction redirige vers le site via

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

query_string étant la chaîne de paramètres de requête dynamique créée par la fonction JavaScript.

La raison de cette bizarrerie est que parfois la même fonction transmet l'URL à un formulaire Web ASP.Net car elle doit utiliser le contrôle reportviewer , l'action alternative consiste à enregistrer certains paramètres dans ce cas, elle passe à la vue. (Peut élaborer plus si cela n'a pas de sens)

Le tout fonctionne bien jusqu'à ce que j'introduise [Authorize] à la méthode d'action. S'interrompt s'il est en place, fonctionne bien sans, et [Authorize] fonctionne bien sur toutes les autres méthodes.

L'URL entière dans ce cas fait 966 caractères, après recherche, il semble que la valeur maxQueryStringLength soit 2048 par défaut mais peut être remplacée par n'importe quelle valeur de type integer, donc juste pour les sourires, j'ai ajouté le

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

clé du fichier de configuration Web sous la clé.

Aucune joie là-bas, alors je suis devenu ridicule et je l'ai fait 4096, toujours pas de joie.

Maintenant que l'URL entière mesure 966 caractères, l'attribut authorize ne peut pas sérieusement ajouter 1082-3130 caractères supplémentaires, alors comment puis-je déterminer quelle est réellement l'erreur ou pourquoi le paramètre ne prend pas effet.

VS2010 Pro SP1

Sabre
la source
Veuillez ajouter le message d'erreur détaillé que vous recevez.
counsellorben

Réponses:

70

Lorsqu'une demande non autorisée arrive, la demande entière est encodée en URL et ajoutée en tant que chaîne de requête à la demande du formulaire d'autorisation, afin que je puisse voir où cela peut entraîner un problème compte tenu de votre situation.

Selon MSDN, l'élément correct à modifier pour réinitialiser maxQueryStringLength dans web.config est l' <httpRuntime>élément à l'intérieur de l' <system.web>élément, voir Élément httpRuntime (schéma de paramètres ASP.NET) . Essayez de modifier cet élément.

counsellorben
la source
1
Hélas, le mettre au bon endroit semble être l'astuce, assez intelligent me guide vers la même clé à l'emplacement où je l'ai initialement postée.
Sabre
8
Il est également bon de savoir que la valeur maximale de ce paramètre est 2097151 - au début, j'ai essayé d'utiliser Int32.MaxValue, mais l'exception qui a été lancée lors de l'exécution m'a amené à utiliser une valeur comprise entre 0 et 2097151.
TimDog
ne fonctionne pas voir ça. stackoverflow.com/questions/31624710/…
Jitendra Pancholi
1
Je crois que bien que vous puissiez définir la valeur maximale de ce paramètre sur 2097151, il existe d'autres paramètres qui affectent la longueur de requête maximale acceptée. J'avais une chaîne de requête beaucoup plus courte que ce maximum qui n'a pas été acceptée - elle comptait 3393 caractères. Une autre requête de 3 200 caractères a bien fonctionné.
markthewizard1234
@ markthewizard1234: D'accord: j'ai augmenté le mien de 2048 à 4096. Cela a eu un certain effet, car le message d'erreur d'origine avec 404. quelque chose pour la chaîne de requête trop longue n'apparaît plus. Mais maintenant, un autre message d'erreur avec le code 400 est renvoyé, indiquant également une chaîne de requête trop longue.
OR Mapper
213

À la racine web.configde votre projet, sous le system.webnœud:

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

De plus, j'ai dû ajouter ceci sous le system.webServernœud ou j'ai eu une erreur de sécurité pour mes longues chaînes de requête:

<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxUrl="10999" maxQueryString="2097151" />
      </requestFiltering>
    </security>
...
theJerm
la source
1
L'ouverture de ce système crée-t-elle de graves failles de sécurité? Quels inconvénients y a-t-il à définir maxurl et maxquery sur 2097151?
Brian
1
Brian, c'est une bonne question - je ne vois aucune faille de sécurité à moins que mettre quelque chose de plus long sur la chaîne de requête en plus d'une limite de navigateur puisse être nuisible. Les chaînes de requête de longueur maximale du navigateur ont-elles la priorité sur cette valeur est une autre question à laquelle je n'ai pas de réponse. Merci de l'avoir demandé, peut-être que quelqu'un ici peut nous éclairer davantage à ce sujet.
theJerm
Je suppose qu'il existe une vulnérabilité DOS potentielle, mais cela dépend de la façon dont vous gérez réellement la demande. J'ai rencontré cela en essayant d'ajouter 100 utilisateurs en une seule demande. Pas quelque chose que je veux de toute façon.
Martin
4
Cela a résolu mon problème immédiatement, car j'avais le même problème sur un projet MVC 4. L'ajout des deux éléments ci-dessus a résolu mon erreur. Merci beaucoup!!
Ed DeGagne
3
Notez que maxQueryStringc'est la longueur en octets comme uint avec une valeur maximale de 4294967295 et maxQueryStringLengthc'est la longueur en caractères comme int mais avec une plage de 0-2097151.
marsze
5

Pour toute autre personne susceptible de rencontrer ce problème et qui n'est résolu par aucune des options ci-dessus, c'est ce qui a fonctionné pour moi.

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

J'avais désactivé cela parce que nous utilisions notre propre authentification, mais cela a conduit au même problème et la réponse acceptée n'a pas aidé en aucune façon.

dball
la source
4

j'ai cette erreur en utilisant datatables.net

J'ai corrigé la modification de l'ajax par défaut Get to POST dans les propriétés de DataTable ()

"ajax": {
        "url": "../ControllerName/MethodJson",
        "type": "POST"
    },
elblogdelbeto
la source
J'utilisais également des tables de données, et après avoir essayé sans succès les suggestions ci-dessus, cette astuce l'a fait.
AidaM