位置路径=""拒绝用户="?"阻止访问域根(“/”)而不是显示 RouteConfig 默认值

location path="" deny users="?" prevents access to domain root ("/") instead of showing RouteConfig default

我正在使用 Katana 来保护我的网站,以及 web.config 中的 location 路径(因为该网站是 ASP.Net 网络表单和 MVC 的混合体)。

我的默认路由是这样配置的,允许在访问根域时显示登录页面(例如www.example.com应该在www.example.com/Public/Login显示登录页面):

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Public", action = "Login", id = UrlParameter.Optional }
        );
    }

Web.config 设置为授予对登录控制器 URL 的访问权限,但拒绝所有其他未授权的内容:

<location path="Public/Login">
    <system.web>
        <authorization>
            <allow users="*" />
        </authorization>
    </system.web>
</location>

<location path="">
    <system.web>
        <authorization>
            <deny users="?" />
        </authorization>
    </system.web>
</location>

www.example.com 外,这工作正常。在本地使用 IISExpress,这些 URL:

https://localhost:44374
https://localhost:44374/

重定向到:

https://localhost:44374/Public/Login?ReturnUrl=%2F

这是不正确的,因为根据默认的 RouteConfig MapRoute 默认值,匿名用户应该可以访问 /

任何人都可以告诉我做错了什么吗?当一个域只有根访问时,有什么方法可以授予访问权限?

在尝试了来自该网站的十几个建议之后,我最终发现这是唯一适用于我的案例的解决方案。我不确定网络表单和 MVC 控制器的混合是否会导致这个问题(路由冲突?),但是将其添加到 global.asax 中效果很好:

namespace MyApplicationNamespace
{
    public class MyApplicationName : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            // leave as is - left here to clarify where new method needs adding
        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            if(Request.AppRelativeCurrentExecutionFilePath == "~/")
            {
                HttpContext.Current.RewritePath("/Public/Login"); // the MVC login controller/action
            }
        }
    }
}