我正在使用Katana以及web.config中的location
路径来保护我的网站(因为该网站是ASP.Net web表单和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
这是不正确的,因为匿名用户应该可以根据默认的RouteConfigMapRoute
默认值访问/
。
有人能告诉我做错了什么吗?当一个域只访问根目录时,有什么方法可以授予访问权限吗?
在尝试了该网站的十几条建议后,我最终发现这是唯一适用于我的解决方案。我不确定Web窗体和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
}
}
}
}