asp.net mvc Route 使用自定义条件(constraints)禁止某ip登陆

前言

本文的目的是利用Mvc route创建一个自定义约束来控制路由跳转实现禁止ip登陆,当然例子可能不合理,但是文章要表明的意思是当普通的路由约束不能解决我们实际的需求时,我们可以通过自定义路由限制条件实现,比如当匹配路由有数据库交互,根据url跳转等实际需求时,使用自定义条件此问题便可迎刃而解。

实现

举例普通的路由约束:

routes.MapRoute(
    "Product",
    "Product/{productId}",
    new {controller="Product", action="Details"},
    new {productId = @"\d+" }
 );
 匹配包含一个的整数productId的URLs。当定义一个route时,我们能够使用一个限制条件来限制URLs,使它匹配这个route。在例子中,这个route包含一个只匹配整数的正则表达式约束。
这里匹配一个整数的productId,当不满足这个条件是将交由另一个route处理,或者,如果没有匹配的routes, “The resource could not be found ”错误将被返回,普通的路由约束可以完成一些简单的没有业务逻辑的路由限制,比如限制某IP用户访问等,下面的自定义约束就是来解决这个问题。
 
自定义条件约束:
下面来看一些System.Web.Route给我们提供的自定义约束的接口IRouteConstraint,定义如下:
// 摘要:
    //     定义类必须实现才能检查某 URL 参数值是否对约束有效的协定。
    [TypeForwardedFrom("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")]
    public interface IRouteConstraint
    {
        // 摘要:
        //     确定 URL 参数是否包含此约束的有效值。
        //
        // 参数:
        //   httpContext:
        //     一个对象,封装有关 HTTP 请求的信息。
        //
        //   route:
        //     此约束所属的对象。
        //
        //   parameterName:
        //     正在检查的参数的名称。
        //
        //   values:
        //     一个包含 URL 的参数的对象。
        //
        //   routeDirection:
        //     一个对象,指示在处理传入请求或生成 URL 时,是否正在执行约束检查。
        //
        // 返回结果:
        //     如果 URL 参数包含有效值,则为 true;否则为 false。
        bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection);
    }

我们只要写一个自定义约束类来实现此接口的Math方法,它返回一个布尔值。这个布尔值决定该请求是否应该被route对象处理。

下面我们来定义自定义路由约束:

public class AbandonConstraint : IRouteConstraint
        {
            public bool Match(HttpContextBase httpContext, Route route, string parameterName,
            RouteValueDictionary values, RouteDirection routeDirection)
            {
                var currentIp = httpContext.Request.UserHostAddress;
                //如果当前访问用户的ip是127.0.0.1,则匹配Abandon路由,如果不是则匹配其他路由
                return currentIp == "127.0.0.1";
            }
        }

路由设置:

routes.MapRoute(
                name: "Abandon",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Abandon", id = UrlParameter.Optional },
                constraints:new { customConstraint = new AbandonConstraint() }//自定义限制路由
            );

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

配置好以后,我们本地运行程序,便能匹配到Abandon路由,若我们修改所要限制的ip地址,则匹配Default路由。如下图本地运行命中abandon默认地址的action

总结:

自定义的路由约束在实际应用中对于复杂的路由匹配条件,比如有数据库交互,提供了便利的使用条件,同时当请求与自定义路由约束匹配时我们还可以动态为其添加,修改路由参数,控制跳转等操作,注意约束条件必须继承IRouteConstraint,并且实现Match方法。

时间仓促,代码及文章比较杂乱,有什么出错的地方欢迎指出。

posted @ 2013-08-12 17:40  狼性法则  阅读(3710)  评论(0编辑  收藏  举报