la solicitud excede el maxQueryStringLength configurado cuando se usa [Authorize]

122

ingrese la descripción de la imagen aquí
Tengo un sitio MVC3 en C #, tengo una vista particular que recibe parámetros de consulta desde una función de JavaScript, la función redirige al sitio a través de

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

query_string es la cadena de parámetros de consulta dinámica creada por la función JavaScript.

La razón de esta rareza es que a veces la misma función pasa la URL a un formulario web ASP.Net debido a que tiene que usar el visor de informes control , la acción alternativa es guardar algunos parámetros en este caso pasa a la vista. (Puede elaborar más si eso no tiene sentido)

Todo funciona bien hasta que le presento a [Autorizar] el método de acción. Se rompe si está en su lugar, funciona bien sin él y [Autorizar] funciona bien en todos los demás métodos.

La URL completa en este caso tiene 966 caracteres, después de la investigación, parece que el valor de maxQueryStringLength es 2048 por defecto, pero se puede anular a cualquier valor de tipo entero, así que solo para las sonrisas agregué el

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

clave al archivo de configuración web debajo de la clave.

No hay alegría allí, así que me puse ridículo y lo hice 4096, todavía sin alegría.

Ahora que la URL completa tiene 966 caracteres, el atributo de autorización no puede agregar en serio otros 1082-3130 caracteres, entonces, ¿cómo puedo determinar cuál es el error en realidad o por qué la configuración no está surtiendo efecto?

VS2010 Pro SP1

Sable
fuente
Agregue el mensaje de error detallado que está recibiendo.
counsellorben

Respuestas:

70

Cuando llega una solicitud no autorizada, toda la solicitud está codificada en URL y se agrega como una cadena de consulta a la solicitud al formulario de autorización, por lo que puedo ver dónde esto puede resultar en un problema dada su situación.

Según MSDN, el elemento correcto para modificar para restablecer maxQueryStringLength en web.config es el <httpRuntime>elemento dentro del <system.web>elemento, consulte Elemento httpRuntime (esquema de configuración de ASP.NET) . Intente modificar ese elemento.

consejero
fuente
1
Por desgracia, ponerlo en el lugar correcto parece ser el truco, lo suficientemente interesante como intellisense me guía a la misma clave en la ubicación en la que originalmente lo publiqué.
Sabre
8
También es bueno saber que el valor máximo para este parámetro es 2097151; al principio intenté usar Int32.MaxValue, pero la excepción que se lanzó en tiempo de ejecución me indicó que usara un valor entre 0 y 2097151.
TimDog
no funciona ver esto. stackoverflow.com/questions/31624710/…
Jitendra Pancholi
1
Creo que, aunque puede establecer el valor máximo de este parámetro en 2097151, hay otros parámetros que afectan la longitud máxima de consulta aceptada. Tenía una cadena de consulta mucho más corta que este máximo que no fue aceptada: tenía 3393 caracteres de longitud. Otra consulta que tenía 3200 caracteres funcionó bien.
markthewizard1234
@ markthewizard1234: De acuerdo: he aumentado el mío de 2048 a 4096. Esto ha tenido algún efecto, ya que el mensaje de error original con 404.something para la cadena de consulta demasiado larga ya no aparece. Pero ahora, se devuelve otro mensaje de error con el código 400, que también indica una cadena de consulta demasiado larga.
OR Mapper
213

En la raíz web.configde su proyecto, debajo del system.webnodo:

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

Además, tuve que agregar esto debajo del system.webServernodo o recibí un error de seguridad para mis cadenas de consulta largas:

<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxUrl="10999" maxQueryString="2097151" />
      </requestFiltering>
    </security>
...
theJerm
fuente
1
¿Abrir esto crea fallas de seguridad graves? ¿Qué aspectos negativos tiene establecer maxurl y maxquery en 2097151?
Brian
1
Brian, esa es una buena pregunta: no puedo ver ninguna falla de seguridad a menos que de alguna manera poner algo más largo en la cadena de consulta además del límite del navegador pueda ser perjudicial. ¿Las cadenas de consulta de longitud máxima del navegador tienen prioridad sobre este valor? Es otra pregunta para la que no tengo la respuesta. Sin embargo, gracias por preguntar, tal vez alguien de aquí pueda arrojar más luz sobre esto.
theJerm
Supongo que existe una vulnerabilidad potencial de DOS, pero eso depende de cómo maneje realmente la solicitud. Me encontré con esto al intentar agregar 100 usuarios en una solicitud. No es algo que quiera que pase de todos modos.
Martin
4
Esto resolvió mi problema de inmediato, ya que estaba teniendo el mismo problema en un proyecto MVC 4. Agregar ambos de los anteriores resolvió mi error. ¡¡Muchas gracias!!
Ed DeGagne
3
Tenga en cuenta que maxQueryStringes la longitud en bytes como uint con un valor máximo de 4294967295 y maxQueryStringLengthes la longitud en caracteres como int pero con un rango de 0-2097151.
marsze
5

Para cualquier otra persona que pueda encontrar este problema y no se resuelva con ninguna de las opciones anteriores, esto es lo que funcionó para mí.

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

Había desactivado esto porque estábamos usando nuestra propia autenticación, pero eso llevó al mismo problema y la respuesta aceptada no ayudó de ninguna manera.

idiota
fuente
4

tengo este error usando datatables.net

Corregí el cambio del ajax predeterminado Get to POST en las propiedades de DataTable ()

"ajax": {
        "url": "../ControllerName/MethodJson",
        "type": "POST"
    },
elblogdelbeto
fuente
También estaba usando tablas de datos, y después de probar sin éxito las sugerencias anteriores, este truco lo hizo.
AidaM