ASP.NET(C#)如何禁止用户访问特定URL路径
禁止特定URL访问的实现方案
之前配置不生效的核心原因
你之前的配置存在两个核心问题,所以无法实现拦截效果:
<location>节点的path属性仅支持填写应用内相对路径,不能填写带http://和域名的完整URL- 如果你使用的是.NET Core/.NET 5+版本项目,框架本身不依赖Web.config、Global.asax处理请求管线,手动新建的这两个文件默认不会被框架加载,自然不会生效。
推荐实现方案(无需手动创建Web.config/Global.asax)
这个方案适配所有默认不生成Web.config、Global.asax的.NET Core/.NET 6+项目,拦截覆盖所有请求场景:不管用户直接在地址栏粘贴路径、页面跳转、还是直接请求路径下的静态资源,都会被拦截,是目前性能最高的实现方式:
- 打开项目根目录下的
Program.cs文件(.NET Core 3.1及更早版本打开Startup.cs) - 在
app.UseAuthorization()中间件之前,加入自定义路径拦截逻辑,代码示例:
// 特定路径拦截中间件 app.Use(async (context, next) => { // 匹配需要拦截的路径,设置大小写不敏感匹配 if (context.Request.Path.StartsWithSegments("/files", StringComparison.OrdinalIgnoreCase)) { // 返回403禁止访问状态码,也可以根据需求自定义跳转页面 context.Response.StatusCode = StatusCodes.Status403Forbidden; return; } // 非拦截路径正常放行 await next(); });
传统.NET Framework 4.x项目修正方案
如果你使用的是传统.NET Framework项目,不需要编写额外代码,只需要修正Web.config配置即可:
- 将
<location>节点的path属性改为相对路径,去掉域名和协议头 - 如果拦截路径下包含静态文件,需要开启所有请求走托管模块,否则静态文件会绕过授权规则直接返回
修正后的配置代码:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <location path="files"> <system.web> <authorization> <deny users="*"/> </authorization> </system.web> <system.webServer> <modules runAllManagedModulesForAllRequests="true" /> </system.webServer> </location> </configuration>
注意:手动创建的Web.config需要在文件属性中把「复制到输出目录」设置为「如果较新则复制」,否则配置不会被IIS/框架加载。
内容的提问来源于stack exchange,提问作者user19111040
相关产品推荐
相关产品推荐

