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

问题描述 投票:0回答:5

enter image description here
我有一个 C# 中的 MVC3 站点,我有一个从 JavaScript 函数提供查询参数的特定视图,该函数通过

重定向到该站点

window.location.href = "../ActionName?" + 查询字符串;

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

造成这种奇怪现象的原因是,有时同一函数将 URL 传递到 ASP.Net Web 表单,因为它必须使用 reportviewer 控件,替代操作是保存一些参数,在这种情况下它传递到视图。 (如果没有意义可以详细说明)

整个事情工作正常,直到我将 [Authorize] 引入到操作方法中。 如果到位就会中断,没有就可以正常工作,并且 [授权] 在所有其他方法上都可以正常工作。

本例中的整个 URL 长度为 966 个字符,经过研究,默认情况下 maxQueryStringLength 值似乎为 2048,但可以覆盖为整数类型的任何值,所以只是为了笑我添加了

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

key下的web配置文件的key。

那里没有快乐,所以我变得可笑并达到了4096,仍然没有快乐。

现在整个 URL 长度为 966 个字符,授权属性不能认真添加另外 1082-3130 个字符,所以我如何确定实际错误是什么,或者为什么设置没有生效。

VS2010专业版SP1

c# javascript asp.net-mvc-3
5个回答
238
投票

在项目的根目录

web.config
中,在
system.web
节点下:

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

此外,我必须将其添加到

system.webServer
节点下,否则我的长查询字符串会出现安全错误:

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

71
投票

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

根据 MSDN,修改 web.config 中重置 maxQueryStringLength 的正确元素是

<httpRuntime>
元素内的
<system.web>
元素,请参阅httpRuntime 元素(ASP.NET 设置架构)。尝试修改该元素。


7
投票

我使用 datatables.net 时遇到此错误

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

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

5
投票

对于可能遇到此问题并且上述任一选项都无法解决的其他人,这对我有用。

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

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


0
投票

我遇到了这个问题,我像这样解决了它(属性 maxRequestLength、maxQueryStringLength 和 maxQueryString 的值对于您的应用程序可能有所不同):

在 web.config 中

将此行放入

<system.web>
   <httpRuntime targetFramework="4.5" maxRequestLength="10240"  maxQueryStringLength="32768"  />
</system.web>

并在system.webServer中写入

<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxQueryString="32768"/>
      </requestFiltering>
    </security>
</system.webServer>

这对我有用。我希望这对某人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.