.NET Core MVC权限校验Middleware发布后无法生效问题咨询
问题核心原因
该问题由中间件执行顺序错误、生产环境反向代理/IIS直接托管静态文件导致:
- 若你的自定义权限校验中间件放在
UseStaticFiles之后,请求/Cvler路径下的静态资源时,静态文件中间件会直接返回资源,完全不会触发你的校验逻辑 - 生产环境的IIS/Nginx默认会优先处理静态文件请求,直接绕过ASP.NET Core管道,你的中间件根本接收不到对应请求
- 开发模式下默认没有开启反向代理静态文件托管、中间件顺序刚好符合要求,所以功能正常
解决步骤
步骤1:调整中间件执行顺序
修改Program.cs(.NET 6+)或Startup.cs(.NET 5及更早版本)的中间件排序,严格按照以下顺序排列:
// 先启用身份认证、授权中间件,确保User对象能正常读取声明 app.UseAuthentication(); app.UseAuthorization(); // 再放你的自定义权限校验中间件,必须放在静态文件中间件之前 app.Use((context, next) => { if (context.Request.Path.StartsWithSegments("/Cvler")) { if (context.User.Identities.Any(identity => identity.HasClaim("pozisyon", "admin"))) { return next(); } context.Response.StatusCode = 401; return Task.CompletedTask; } return next(); }); // 最后再启用静态文件中间件 app.UseStaticFiles();
步骤2:配置生产环境托管服务不直接处理/Cvler路径资源
IIS托管场景
在项目根目录的web.config文件中加入以下配置,禁止IIS静态文件模块直接返回/Cvler路径下的资源:
<system.webServer> <security> <requestFiltering> <hiddenSegments> <add segment="Cvler" /> </hiddenSegments> </requestFiltering> </security> </system.webServer>
Nginx托管场景
修改Nginx配置,删除/Cvler路径的静态文件直接匹配规则,确保该路径下的所有请求都转发到ASP.NET Core服务处理。
更规范的替代方案
不需要写自定义中间件,直接在静态文件中间件的配置中加入权限校验即可,避免顺序问题:
app.UseStaticFiles(new StaticFileOptions { OnPrepareResponse = ctx => { if (ctx.Context.Request.Path.StartsWithSegments("/Cvler")) { if (!ctx.Context.User.HasClaim("pozisyon", "admin")) { ctx.Context.Response.StatusCode = 401; ctx.Context.Response.ContentLength = 0; ctx.Context.Response.Body = Stream.Null; } } } });
内容的提问来源于stack exchange,提问作者Saltukz
相关产品推荐
相关产品推荐

