使用[Authorize]时,请求超出了配置的maxQueryStringLength


121

在此处输入图片说明
我在C#中有一个MVC3网站,我在一个特定的视图中从JavaScript函数获取查询参数,该函数通过重定向到该站点

window.location.href =“ ../ActionName?” + query_string;

query_string是由JavaScript函数构建的动态查询参数字符串。

这种怪异的原因是,有时相同的函数由于必须使用reportviewer控件而将URL传递给ASP.Net Web窗体,在这种情况下,备用操作是保存一些参数,该函数将传递给视图。(如果没有意义,可以详细说明)

在向动作方法介绍[Authorize]之前,整个过程都工作正常。如果安装到位,则中断,如果没有,则可以正常运行,并且在其他所有方法上,[授权]都可以正常运行。

在这种情况下,整个网址的长度为966个字符,经过研究后,似乎maxQueryStringLength的默认值是2048,但可以覆盖任何整数类型的值,因此我只对咧嘴笑说就添加了

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

密钥下的Web配置文件的密钥。

那里没有欢乐,所以我很荒谬,把它变成了4096,仍然没有欢乐。

现在,整个URL的长度为966个字符,authorize属性不能再严重添加另外的1082-3130个字符,因此,我如何确定错误实际上是什么,或为什么设置无效。

VS2010 Pro SP1


请添加您收到的详细错误消息。
counsellorben

Answers:


70

当出现未经授权的请求时,整个请求都经过URL编码,并作为查询字符串添加到授权表单的请求中,因此,我可以根据您的情况查看在哪里可能导致问题。

根据MSDN,在web.config中要修改以重置maxQueryStringLength的正确元素是该<httpRuntime>元素内的<system.web>元素,请参阅httpRuntime元素(ASP.NET设置架构)。尝试修改该元素。


1
las,将其放置在正确的位置似乎是个窍门,足够多的intellisense引导我也可以将其放置在我最初发布该位置的相同键上。
Sabre

8
还不错,知道是这个PARAM最大值为2097151 -在尝试使用Int32.MaxValue第一我,但在运行时抛出的异常指着我用0和2097151之间的值
TimDog


1
我相信,尽管您可以将此参数的最大值设置为2097151,但是还有其他一些参数会影响所接受的最大查询长度。我的查询字符串比不可接受的最大值短得多-它的长度为3,393个字符。另一个长度为3200个字符的查询工作正常。
markthewizard1234

@ markthewizard1234:同意:我已经将我的名字从2048增加到4096。这已经产生了一些效果,因为带有404.something的原始错误消息不再出现。但是现在,返回了另一个错误代码为400的错误消息,该错误消息表明查询字符串过长。
或Mapper

212

web.config项目的根目录中的system.web节点下:

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

另外,我必须将此添加到system.webServer节点下,否则我的长查询字符串会遇到安全错误:

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

1
打开此窗口是否会造成任何严重的安全漏洞?将maxurl和maxquery设置为2097151有什么负面影响?
布莱恩(Brian)

1
Brian,这是一个很好的问题-我看不到任何安全漏洞,除非以某种方式在浏览器限制之外在查询字符串上放置更长的内容可能有害。浏览器最大长度查询字符串是否优先于此值,这是我没有答案的另一个问题。不过,感谢您的询问,也许这里的某人可以对此有所了解。
theJerm 2012年

我猜可能存在DOS漏洞,但这取决于您实际处理请求的方式。我在尝试在一个请求中添加100个用户时遇到了这个问题。无论如何,我都不想发生任何事情。
马丁

4
这立即解决了我的问题,因为我在MVC 4项目中遇到了同样的问题。添加以上两个都解决了我的错误。非常感谢!!
Ed DeGagne

3
Mind maxQueryString是以uint 表示的字节长度,最大值为4294967295,并且maxQueryStringLength是以int表示的字符长度,但范围为0-2097151。
marsze

5

对于可能遇到此问题且上述任何一种方法都无法解决的其他人,这对我来说是有效的。

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

我禁用了此功能是因为我们使用的是自己的Auth,但这导致了同样的问题,并且被接受的答案没有任何帮助。


4

我使用datatables.net遇到此错误

我修复了在DataTable()的te属性中更改默认ajax Get to POST的问题

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

我也在使用数据表,在尝试了上述建议失败之后,这个技巧就做到了。
AidaM
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.