Katana+Web.config配置问题:根路径被拒而非跳转默认路由
你遇到的问题核心在于ASP.NET的web.config授权规则是在MVC路由解析之前执行的。当用户访问https://localhost:44374/时,ASP.NET首先检查<location path="">下的授权规则(<deny users="?" />),此时路由还没把根路径映射到Public/Login,所以直接触发了未授权重定向——等路由逻辑执行时,重定向已经完成,自然不符合你的预期。
针对混合Web Forms + MVC的场景,推荐两种方案,你可以根据实际情况选择:
方案1:为根路径添加单独的匿名授权规则
既然web.config的授权先执行,那我们直接给根路径/添加允许匿名的配置,和Public/Login的规则并列:
<!-- 允许根路径匿名访问 --> <location path=""> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location> <!-- 允许登录页匿名访问 --> <location path="Public/Login"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location> <!-- 拒绝其他所有未授权请求 --> <location path="." inheritInChildApplications="false"> <system.web> <authorization> <deny users="?" /> </authorization> </system.web> </location>
这里用<location path=".">匹配除根路径和Public/Login之外的所有请求(path="."代表当前目录下的所有资源,会覆盖子路径),确保其他路径仍需授权。
方案2:改用MVC授权属性(更推荐,适合MVC为主的场景)
因为你用了Katana(OWIN),配合MVC的[Authorize]和[AllowAnonymous]属性会更灵活,也能避免web.config路径匹配的冲突:
在MVC控制器上标记授权属性:
- 给
PublicController的Login方法添加[AllowAnonymous],明确允许匿名访问:public class PublicController : Controller { [AllowAnonymous] public ActionResult Login() { return View(); } } - 给其他需要授权访问的控制器或方法添加
[Authorize]属性:[Authorize] public class DashboardController : Controller { // 这里的方法都需要授权才能访问 }
- 给
调整web.config配置:
去掉原来的location授权规则,改为默认允许所有路径匿名,把授权逻辑交给MVC属性和Katana中间件:<system.web> <authorization> <allow users="*" /> </authorization> </system.web>对于Web Forms页面的授权,你仍然可以单独用
<location>标签配置,比如某个Admin.aspx需要授权:<location path="Admin.aspx"> <system.web> <authorization> <deny users="?" /> </authorization> </system.web> </location>
额外注意:检查默认文档设置
如果你的站点配置了默认文档(比如default.aspx、index.html),ASP.NET会优先尝试访问这些文档,而不是走MVC路由。可以在web.config里禁用默认文档,确保根路径直接触发MVC路由:
<system.webServer> <defaultDocument enabled="false" /> </system.webServer>
这样调整后,访问根路径/时,会先通过授权检查,再执行路由映射到Public/Login,就不会出现不必要的重定向了。
内容的提问来源于stack exchange,提问作者EvilDr

