.NET Core请求过滤模块报错:查询字符串过长,如何解决?
解决.NET Core认证授权应用中ReturnURL过长导致的请求过滤错误
1. 优化ReturnURL生成逻辑
ReturnURL过长大多是因为未授权请求被重定向到登录页时,原请求的完整URL(含大量参数或长路径)被作为参数传递。可以通过两种方式优化:
- 截断或精简ReturnURL:在Cookie认证中间件的
OnRedirectToLogin事件中,只保留相对路径并限制长度,避免查询字符串溢出:
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.Events = new CookieAuthenticationEvents { OnRedirectToLogin = context => { string returnUrl = $"{context.Request.Path}{context.Request.QueryString}"; // 自定义合理长度,比如200字符 if (returnUrl.Length > 200) { returnUrl = returnUrl.Substring(0, 200); } context.Response.Redirect($"/Account/Login?ReturnUrl={Uri.EscapeDataString(returnUrl)}"); return Task.CompletedTask; } }; });
- 临时存储原请求:把原请求的URL存入Session,生成唯一ID作为参数传递到登录页,登录成功后通过ID取出原URL跳转,避免直接传递长字符串。
2. 配置.NET Core自身的请求限制
除了IIS的设置,.NET Core的Kestrel服务器也有请求大小限制,需要在Program.cs中调整:
builder.WebHost.ConfigureKestrel(options => { // 按需增大请求行和请求头总大小,示例值可根据实际调整 options.Limits.MaxRequestLineSize = 8192; options.Limits.MaxRequestHeadersTotalSize = 32768; });
也可以通过appsettings.json配置:
{ "Kestrel": { "Limits": { "MaxRequestLineSize": 8192, "MaxRequestHeadersTotalSize": 32768 } } }
3. 确保IIS配置生效
如果修改了web.config的requestLimits后没效果,需要确认:
- 修改后的web.config配置示例:
<system.webServer> <security> <requestFiltering> <!-- 调大最大查询字符串长度,比如设置为8192 --> <requestLimits maxQueryString="8192" /> </requestFiltering> </security> </system.webServer>
- 重启应用池,确保配置生效;如果用IIS Express,需要修改项目
.vs/config/applicationhost.config中对应站点的requestLimits,然后重启IIS Express。
4. 排查循环重定向问题
若存在循环重定向,会导致ReturnURL不断累加变长:比如登录页需要授权,未授权用户访问首页→重定向到登录页→登录页又重定向回首页,反复循环。需确保登录页允许匿名访问:
app.UseAuthorization(); // 确保Account控制器的Login动作允许匿名 app.MapControllerRoute( name: "account", pattern: "Account/{action=Login}", defaults: new { controller = "Account" }) .AllowAnonymous(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
内容的提问来源于stack exchange,提问作者Daneesha
相关产品推荐
相关产品推荐

