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

前言

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

实现

举例普通的路由约束:

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

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

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

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

路由设置:

  1. routes.MapRoute(
  2. name: "Abandon",
  3. url: "{controller}/{action}/{id}",
  4. defaults: new { controller = "Home", action = "Abandon", id = UrlParameter.Optional },
  5. constraints:new { customConstraint = new AbandonConstraint() }//自定义限制路由
  6. );
  7.  
  8. routes.MapRoute(
  9. name: "Default",
  10. url: "{controller}/{action}/{id}",
  11. defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
  12. );

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

总结:

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

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

 
 
 
标签: .net mvc

asp.net mvc Route 使用自定义条件(constraints)禁止某ip登陆的更多相关文章

  1. ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)

    ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需 要将相应的ValidationAttr ...

  2. 在ASP.NET MVC 3 中自定义AuthorizeAttribute时需要注意的页面缓存问题

    一.ASP.NET MVC中使用OutputCache实现服务器端页面级缓存 在ASP.NET MVC中,假如我们想要将某个页面(即某个Action)缓存在服务器端,可以在Action上标上以下特性: ...

  3. ASP.NET MVC Route详解

    在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎.Razor在减少代码冗余.增 ...

  4. asp.net mvc 简易通用自定义Pager实现分页

    asp.net mvc 自定义Pager实现分页 Intro 一个WEB应用程序中经常会用到数据分页,本文将实现一个简单通用的分页组件,包含一个 PagerModel (用来保存页码信息),一个 Ht ...

  5. 在 ASP.NET MVC 中创建自定义 HtmlHelper

    在ASP.NET MVC应用程序的开发中,我们常碰到类似Html.Label或Html.TextBox这样的代码,它将在网页上产生一个label或input标记.这些HtmlHelper的扩展方法有些 ...

  6. asp.net mvc 中的自定义验证(Custom Validation Attribute)

    前言

  7. asp.net MVC helper 和自定义函数@functions小结

    asp.net Razor 视图具有.cshtml后缀,可以轻松的实现c#代码和html标签的切换,大大提升了我们的开发效率.但是Razor语法还是有一些棉花糖值得我们了解一下,可以更加强劲的提升我们 ...

  8. [转]asp.net MVC helper 和自定义函数@functions小结

    本文转自:http://www.cnblogs.com/jiagoushi/p/3904995.html asp.net Razor 视图具有.cshtml后缀,可以轻松的实现c#代码和html标签的 ...

  9. ASP.NET MVC随想录——创建自定义的Middleware中间件

    经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅——创建自定义的Middleware中间件. 何为Middleware中间件 M ...

随机推荐

  1. iOS、真机调试

    Xcode中IOS.真机测试 一.购买开发者账号(需要有信用卡.每年支付$99.0) 二.直接淘宝购买一个.用于测试,但是不能上传App 1.获取手机的UUID(Identifier xxxxxx9e ...

  2. struts2的Action该方法不能去

    最近做的一个特征,使用struts2,input标签内容,并与相应的内容背景的实体类,当提交方法,无法进入action该方法和程序没有报错被,检验N通方法还没有找到,查找终于找到了,它是input标签 ...

  3. web设计师和前端设计师的互动—前端工程师应该具备的三种思维

    如果你是一个天才工程师(马上可以离开),可以独立完成一个很多事情,你可以是一个怪咖,因为我相信没有一个人不会不佩服你.但现实归现实,多数人都不是天才,而我们在职场上也不是单打独斗,我们需要团队合作,需 ...

  4. 谈谈那些年PHP中屌屌的验证码

    验证码已经是现在网站中非常基础的知识点了,验证码的存在可以防止恶意破解密码.刷票.灌水,可以有效的防止暴力破解特定用户. 现在就来了解了解那些年PHP中屌屌的验证码吧. 首先,以四位验证码为例(多位验 ...

  5. [DevExpress]利用LookUpEdit实现类似自动提示效果

    原文:[DevExpress]利用LookUpEdit实现类似自动提示效果 关键代码: public static void BindWithAutoCompletion(this LookUpEdi ...

  6. windows 7 telnet 开启关闭

    win7运行telnet提示:'telnet' 不是内部或外部命令,也不是可运行的程序或批处理文件 原因:win7默认没有打开此功能 解决方案:控制面板->程序和功能->打开或关闭wind ...

  7. Windows版Cacti全新安装与升级

    全新安装 Cacti运行依赖的软件很多,mysql.PHP.Apache.Spine.rrd等,一个一个的安装非常繁琐,而且还容易出错,全新安装的话可以采用论坛提供的windows安装包安装,非常简单 ...

  8. <图形图像,动画,多媒体> 读书笔记 --- 力学行为特性

    UIKit力学行为包括了:重力(UIGravityBehavior),碰撞(UICollisionBehavior),吸附(UIAttachmentBehavior),推(UIPushBehavior ...

  9. C#:判断当前程序是否通过管理员运行

    原文:C#:判断当前程序是否通过管理员运行 public bool IsAdministrator() { WindowsIdentity current = WindowsIdentity.GetC ...

  10. web浏览器中javascript

    1.异步载入一个js代码function loadasync(url) { var head = document.getElementsByTagName("head")[0]; ...