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;
else
return true;
} public ActionResult RedirectLogin(bool redirect = true)
{
if (redirect)
return RedirectToAction("Login", "Home", new { from = Request.Url.ToString() });
else
return 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)
{
//验证是否是匿名访问的Action
object[] attrsAnonymous = filterContext.ActionDescriptor.GetCustomAttributes(typeof(AnonymousAttribute), true);
//是否是Anonymous
var Anonymous = attrsAnonymous.Length == ;
return Anonymous;
}
}

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

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

其它文章 :

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

最新文章

  1. [LeetCode] Guess Number Higher or Lower II 猜数字大小之二
  2. View Controller Relationships
  3. 笔记26-徐 SQLSERVER内存分配和常见内存问题
  4. 打开Genesis设置单位为mm
  5. js设计模式-单例模式
  6. 6)Java中String类
  7. cocos2d-x lua与c++简单交互
  8. Sql server 数据库中,纯SQL语句查询、执行 单引号问题。
  9. 图片延迟加载scrollLoading.js应用
  10. 【007】【JVM——内存分配和恢复策略】
  11. .net 平台下, Socket通讯协议中间件设计思路(附源码)
  12. sublime text3汉化
  13. Svn在工作中的实践感悟
  14. C#通过COM组件操作IE浏览器(二):使用IHTMLDocument3完成登录
  15. [hdu6183][Color it]
  16. 微信内置浏览器submit函数无效的问题
  17. MySQL慢查询1- 开启慢查询
  18. linux 初始化工作环境
  19. 【第六课】Nginx常用配置下详解
  20. Python + Robotframework + Appium 之APP自动化测试实践(二)

热门文章

  1. HDU 1106 排序(排序)
  2. The 15th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple - J CONTINUE...?
  3. centos7下扩充swap空间
  4. [BZOJ3816][清华集训2014]矩阵变换(稳定婚姻问题)
  5. 【BZOJ3167/4824】[Heoi2013]Sao/[Cqoi2017]老C的键盘
  6. [BZOJ 1805] Sail 船帆
  7. 【数形结合】Gym - 100923I - Por Costel and the Pairs
  8. Mybatis全部标签
  9. 【OpenJudge9267】【递推】核电站
  10. IntelliJ IDEA强制更新Maven的包