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方法。

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

 
 
 
标签: .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. Oracle 免费的数据库

    Oracle 免费的数据库--Database 快捷版 11g 安装使用与"SOD框架"对Oracle的CodeFirst支持 一.Oracle XE 数据库与连接工具安装使用 O ...

  2. Java对象比较器对泛型List进行排序-Demo

    针对形如:字段1 字段2 字段3 字段n 1 hello 26 7891 world 89 5562 what 55 4562 the 85 452 fuck 55 995 haha 98 455 以 ...

  3. MFC 界面编程 可参考资料

    http://www.codeproject.com/Articles/26887/A-user-draw-button-that-supports-PNG-files-with-tr http:// ...

  4. 【Android平台安全方案】の #00-请不要在外部存储(SD卡)加密存储的敏感信息

    本文翻译自https://www.securecoding.cert.org/confluence/display/java/DRD00-J.+Do+not+store+sensitive+infor ...

  5. windows下 composer常见问题及处理

    错误一: Warning: This development build of composer is over 30 days old. It is recommend ed to update i ...

  6. Spring MVC 的 研发之路

    翻译器:intellij idea 一个.创建spring mvcproject   一个. 二. 三. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcX ...

  7. FineUI开发实践

    ASP.NET-FineUI开发实践-7 摘要: 下拉显示grid列表.其实很简单,但是试了很多方法,水平有限,主要是都不好使,还是简单的好使了,分享下.先是看了看网上的,是直接写个了extjs控件类 ...

  8. 【C#版本详情回顾】C#2.0主要功能列表

    泛型 优点:类型安全/重用代码/提升性能 应用:泛型接口.泛型类.泛型类型参数.泛型方法.泛型事件和泛型委托 命名空间:System.Collections.Generic 特性:泛型约束,defau ...

  9. WCF RIA Services异常

    .svc处理程序映射缺失导致的WCF RIA Services异常 在确定代码.编译结果和数据库都正常的情况下,无法从数据库取到数据.错误提示:Sysyem.Net.WebException:远程服务 ...

  10. 打开Openstack dashboard出现Internal Server Error

    最近研究openstack,想把自己遇到的问题记录下来,同时如果有别的朋友也碰到同样问题的时候可以有个参考. 这次的问题是在openstack搭建好之后,dashboard本身是能用的,但是在某一天后 ...