如何使.NET WebForm路由与授权一起工作

时间:2010-12-21 18:50:26

标签: .net model-view-controller .net-4.0 routing webforms

我有从数据库注册到asp.net网站(非MVC)的路由。路线注册正常,它们都在我登录时工作。我想要做的是根据一些路线数据创建一个登陆页面:

Page是[site] / landing / dell

路线看起来像是:“登陆/ {客户端}”并且它路由到我的页面Login.aspx,在那里我将客户端移出路线,然后根据值显示一些自定义品牌数据。

在我的web.config中,我将我的身份验证模式设置为表单,我的loginUrl =“Login.aspx”

当用户没有授权cookie时,它会将用户重定向到:

[site] /Login.aspx?ReturnUrl=%2flanding%2fdell而不是保留路由网址,并显示正确的数据。 IIS服务器实际上根本不处理路由,只是将用户发送到Login.aspx页面。

我已经尝试了几次添加到我的web.config: <location path="landing"><system.web><authorization><allow users="*"/></auth></sys.web></loc>等,以及许多变化,但似乎没有任何效果。

任何人的想法?我认为这是一个常见的问题,而且没有详细记录。

1 个答案:

答案 0 :(得分:1)

好的,终于明白了。我将尝试以一种简单的形式解释这一点,希望有一天能帮助其他人。

这里要记住几件事,首先,它是一个非MVC应用程序,纯粹是webforms。

在我的Global.ascx中,有一种方法:

    void RegisterRoutes(RouteCollection routes)
    {
        routes.Add(new Route("{resource}.axd/{*pathInfo}", new StopRoutingHandler()));
        routes.Add(new Route("{service}.asmx/{*pathInfo}", new StopRoutingHandler()));
        routes.Add(new Route("*.psd/{*pathinfo}", new StopRoutingHandler()));
        routes.Add(new Route("*.js/{*pathinfo}", new StopRoutingHandler()));
        routes.Add(new Route("*.jpg/{*pathinfo}", new StopRoutingHandler()));
        routes.Add(new Route("*.gif/{*pathinfo}", new StopRoutingHandler()));
        routes.Add(new Route("{resource}.css/{*pathinfo}", new StopRoutingHandler()));

        routes.RouteExistingFiles = false;

        Data.DataContext context = new Data.DataContext();

        var AppRoutes = (from r in context.SomeRouteTable
                         select r).ToList();

        foreach (var AppRoute in AppRoutes)
        {
            routes.MapPageRoute(AppRoute.RouteName,
                                AppRoute.RouteUrl,
                                AppRoute.PhysicalFile, false);
            // The important part is the "false" above.  It is the 
            // CheckPhysicalUrlAccess parameter.
        }
    }

现在,在web.config中,需要添加一个条目:

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

在Global.asax文件的Application_Start中,只需调用RegisterRoutes函数:

this.RegisterRoutes(RouteTable.Routes);

重启服务器,完成了。现在您登录页面的路线将起作用,但您的所有其他路线都是安全的。如果您需要公开另一条路线,您只需要将路径的基本路径添加到system.web授权部分,并允许users =“*”。

其中的另一件事,希望能够帮助他人的是能够将所有javascript(js),图像(psd,jpg,gif),甚至是路由处理程序中的任何静态文件。在整个网络上,解释了.axd和.asmx,但是在处理webforms模型中的路由时,我从未在某个位置找到如何忽略其他静态文件类型。

我希望这可以帮助其他人,并节省他们花在跟踪所有这些内容并自己完成所有单元测试的时间。

尽情享受。