ASP.NET Core 2.0:认证中间件是否应对不存在的API路由返回403?
关于ASP.NET Core 2.0认证中间件对不存在路由的响应问题
你的理解其实是对的,但这里有个关键前提——认证中间件必须在路由匹配中间件之前执行,这才是文档示意图逻辑成立的核心。
咱们来拆解一下细节:
- ASP.NET Core的中间件严格遵循
Startup.cs里Configure方法的添加顺序处理请求:请求进入时从上到下依次经过中间件,响应返回时则反向执行。 - 文档示意图的逻辑是:如果认证中间件优先执行,那么不管请求的路由是否存在,只要认证失败(比如缺少有效凭证、凭证无效),认证中间件就会直接拦截请求,返回
401 Unauthorized,根本不会让请求走到路由匹配的环节。 - 你实际遇到的“不存在路由返回404”,大概率是因为把认证中间件放在了路由相关中间件(比如
UseMvc)之后。这种情况下,请求会先走到路由匹配步骤,发现没有对应路由后直接返回404 Not Found,认证中间件根本没机会处理这个请求。
另外还要明确认证和授权的核心区别:
- 认证(Authentication)是验证“你是谁”,这个过程不需要知道具体路由,所以必须前置,放在路由匹配之前。
- 授权(Authorization)是验证“你能不能访问这个资源”,它需要依赖请求对应的路由/端点的权限策略,所以授权中间件(
UseAuthorization)必须放在路由匹配之后。如果路由不存在,授权中间件根本不会被触发,自然也不会返回403 Forbidden——403是用户已认证,但没有权限访问指定路由时才会返回的状态码。
给你一个ASP.NET Core 2.0里正确的中间件顺序示例:
public void Configure(IApplicationBuilder app) { // 先添加认证中间件,确保所有请求先经过认证校验 app.UseAuthentication(); // 再添加路由及MVC中间件 app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
总结一下:只要把认证中间件放在路由中间件之前,所有未通过认证的请求(无论路由是否存在)都会返回401;如果路由中间件在前,不存在的路由会直接返回404,认证中间件无法干预。而403和不存在的路由没有关系,它是授权环节的专属返回码。
内容的提问来源于stack exchange,提问作者Prabu
相关产品推荐
相关产品推荐

