ActionFilterAttribute里有OnActionExecuting方法,跟Controller一样, 同是抽象实现了IActionFilter接口。

// 登录认证特性
public class AuthenticationAttribute : ActionFilterAttribute
{public override void OnActionExecuting(ActionExecutingContext filterContext){if (filterContext.HttpContext.Session["username"] == null)filterContext.Result = new RedirectToRouteResult("Login", new RouteValueDictionary { { "from", Request.Url.ToString() } });base.OnActionExecuting(filterContext);}
}

使用方法如下:

public class HomeController : Controller
{ [Authentication] public ActionResult Index(){return View();}
}

如果你想针对整个MVC项目的所有Action都使用此过滤器,步骤如下:

a. 确保Global.asax.cs的Application_Start方法中包含如下红色行:

public class MvcApplication : System.Web.HttpApplication
{protected void Application_Start(){AreaRegistration.RegisterAllAreas();WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);}
}

b. 在FilterConfig.cs文件中注册相应的特性过滤器:

public class FilterConfig
{public static void RegisterGlobalFilters(GlobalFilterCollection filters){filters.Add(new HandleErrorAttribute()); filters.Add(new AuthenticationAttribute());}
}

如此,通过过滤器的方法实现认证和授权

另有不推荐的方法实现授权功能,自定义一个控制器类,再通过继承这个控制器类:

1、继承Controller:

1.1 参考WebForm使用方式,在派生类里自己添加了验证方法,然后在每个Action方法里调用。

派生类如下:

public class AuthenticationControllor : Controller
{public bool Validate(){if (Session["username"] == null)return false;elsereturn true;}public ActionResult RedirectLogin(bool redirect = true){if (redirect)return RedirectToAction("Login", "Home", new { from = Request.Url.ToString() });elsereturn RedirectToAction("Login", "Home");}
}

使用类如下:

public class HomeController : AuthenticationControllor
{public ActionResult Index(){if (!Validate())return RedirectLogin();return View();}
}

1.2 改进上面的使用,通过用Controller里有一个OnActionExecuting方法,此方法是在Action之前执行的,非常方便。

派生类如下:

public class AuthenticationControllor : Controller
{protected override void OnActionExecuting(ActionExecutingContext filterContext){if (filterContext.HttpContext.Session["username"] == null)filterContext.Result = new RedirectToRouteResult("Login", new RouteValueDictionary { { "from", Request.Url.ToString() } });base.OnActionExecuting(filterContext);}
}

使用类如下:

// 不需要多写任何逻辑代码就能判断是否登录并跳转
public class HomeController : AuthenticationControllor
{public ActionResult Index(){ return View();}
}

/// <summary>/// 权限拦截/// </summary>[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]public class PermissionFilterAttribute : ActionFilterAttribute{/// <summary>/// 权限拦截/// </summary>/// <param name="filterContext"></param>public override void OnActionExecuting(ActionExecutingContext filterContext){if (!this.CheckAnonymous(filterContext)){//未登录验证if (SessionHelper.Get("UserID") == null){//跳转到登录页面filterContext.RequestContext.HttpContext.Response.Redirect("~/Admin/User/Login");}}}/// <summary>/// [Anonymous标记]验证是否匿名访问/// </summary>/// <param name="filterContext"></param>/// <returns></returns>public bool CheckAnonymous(ActionExecutingContext filterContext){//验证是否是匿名访问的Actionobject[] attrsAnonymous = filterContext.ActionDescriptor.GetCustomAttributes(typeof(AnonymousAttribute), true);//是否是Anonymousvar Anonymous = attrsAnonymous.Length == 1;return Anonymous;}}

通过写一个BaseController来进行权限的验证,这样就不需要所有需要验证的Controller加标注了,当然BaseController还可以增加其他通用的处理

/// <summary>/// Admin后台系统公共控制器(需要验证的模块)/// </summary>
    [PermissionFilter]public class BaseController:Controller{}

其它文章 :

http://www.cnblogs.com/sunkaixuan/p/4908773.html

MVC之ActionFilterAttribute自定义属性相关推荐

  1. .NET MVC过滤器ActionFilterAttribute验证权限以及Model

    项目使用.NET MVC开发,在开发过程中网站权限以及页面ViewModel的验证是比较常见的,本文主要记录在维护以前.NET MVC项目时将权限和Model的验证通过过滤器ActionFilterA ...

  2. ASP.NET MVC Filter过滤机制(过滤器、拦截器)

    https://blog.csdn.net/knqiufan/article/details/82413885 本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/ ...

  3. asp.net mvc Partial OutputCache 在SpaceBuilder中的应用实践

    最近给SpaceBuilder增加OutputCache 时发现了一些问题,贴在这做个备忘,也方便遇到类似问题的朋友查阅. 目前SpaceBuilder表现层使用是asp.net mvc v1.0,使 ...

  4. android studio怎么输入中文,Android studio 模拟器中输入中文

    [C#] 多线程总结(结合进度条) 线程生命周期(来源 w3cschool) 未启动状态:当线程实例被创建但 Start 方法未被调用时的状况. 就绪状态:当线程准备好运行并等待 CPU 周期时的状况 ...

  5. 微服务中的面向切面编程和更多模式

    目录 介绍 如何建立这篇文章? 在Java中使用代码(11 +,Spring boot 2.2 +,Spring Boot AOP,AspectJ) 在C#中使用代码(7,.NET MVC Core ...

  6. Asp.Net Core基于JWT认证的数据接口网关Demo

    Asp.Net Core基于JWT认证的数据接口网关Demo 近日,应一位朋友的邀请写了个Asp.Net Core基于JWT认证的数据接口网关Demo.朋友自己开了个公司,接到的一个升级项目,客户要求 ...

  7. MVC之 自定义过滤器(ActionFilterAttribute)

    一.自定义Filter 自定义Filter需要继承ActionFilterAttribute抽象类,重写其中需要的方法,来看下ActionFilterAttribute类的方法签名. //表示所有操作 ...

  8. MVC中利用ActionFilterAttribute过滤关键字

    在开发过程中,有时候会对用户输入进行过滤,以便保证平台的安全性.屏蔽的方法有很多种,但是今天我说的这种主要是利用MVC中的ActionFilterAttribute属性来实现.由于MVC天然支持AOP ...

  9. MVC 过滤器使用 ActionFilterAttribute

    在asp.net mvc 中 webapi 和 mvc 处理消息是两个不同的管道,Asp.net mvc 和 webapi 为我们提供的 ActionFilterAttribute 拦截器,通过 重写 ...

最新文章

  1. 腾讯吃鸡 android,腾讯吃鸡手游《光荣使命》正式上线:安卓/iOS不限号测试
  2. 格式化网上复制过来的源代码
  3. android js 开屏动画,利用Flutter实现“孔雀开屏”的动画效果
  4. JAVA笔记20-容器之四Map接口、自动打包、泛型(重要)
  5. UE4 C++最基础的API
  6. VB基础入门教程.doc
  7. 相爱相杀:移动联通IT支撑回忆录(九)
  8. 计算机中三大总线:地址总线、数据总线、控制总线
  9. 我私藏的那些实用的终端命令行工具
  10. 给Office文档加密方式与原理揭秘
  11. 1小时,不会代码的我如何完成 网易云音乐 大作业网页制作?(IVX 第2篇)
  12. Java学习软件安装详解
  13. a+aa+aaa+aaaa+aaaaa.....
  14. 今日油条——2020年最成功的事件营销案例
  15. 如果你不会使用Markdown,读这个
  16. 基于FPGA的自动导航系统智能车
  17. python-双均线系统-参数优化
  18. 牛奶可乐经济学之Q11:为什么地产经纪人常带客户看两栋差不多完全一样的房子,可其中一栋比另一栋既便宜、环境又好?
  19. 完全免费!60美元的音乐视频格式转换专家下载 (Xilisoft Video Converter Ultimate中文版)...
  20. 从源码解析-Android中View的绘制流程及performTraversals方法

热门文章

  1. ITK:计算图像的逆FFT
  2. VTK:Points之NormalEstimation
  3. OpenCV加载图像列表imagelist的实例(附完整代码)
  4. Qt Creator调试C ++示例应用程序
  5. OpenGL GLFW
  6. C++ namespace 命名空间
  7. pytroch 数据增量 transforms的二十二个方法
  8. listener.ora--sqlnet.ora--tnsnames.ora的关系以及手工配置举例(转载:http://blog.chinaunix.net/uid-83572-id-5510.ht)
  9. Oracle基本查询
  10. 打开高效文本编辑之门_Linux awk之关联数组