ASP .Net MVC C# 中可以应用过滤器的级别是什么?
ASP .Net MVC 是 Microsoft 推出的一款模型-视图-控制器(Model-View-Controller,MVC)开发框架,通过对请求的过滤器(Filter)进行级别管理,可以有效地帮助我们实现对请求和响应的管控。在 ASP .Net MVC 中,过滤器可以在控制器、动作、全局等不同的级别进行应用。
1. 控制器级别
在控制器层级上应用过滤器,可以对该控制器下的所有动作进行过滤。
我们可以创建一个继承于 ActionFilterAttribute 类的自定义控制器过滤器,并在需要应用该控制器过滤器的控制器上使用特性(Attribute)进行标记。
在下面的代码片段中,我们已经创建了一个自定义的控制器过滤器 MyControllerFilter,该过滤器会在执行控制器动作前后分别打印日志。
public class MyControllerFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Debug.WriteLine("控制器动作执行前:" + filterContext.ActionDescriptor.ActionName);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Debug.WriteLine("控制器动作执行后:" + filterContext.ActionDescriptor.ActionName);
}
}
[MyControllerFilter]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
在上面的代码中,我们在 HomeController 上使用了 MyControllerFilter 特性,表示该控制器下的所有动作都会被该过滤器进行拦截,并执行 OnActionExecuting 和 OnActionExecuted 方法中的代码。
1.1 实现控制器级别的身份验证
可以通过属性路由(Attribute Routing)的方式,实现控制器级别的身份验证。可以在控制器的构造函数中添加需要身份验证的用户角色,每次请求到达控制器时,都会检测用户的角色是否拥有执行该控制器的权限。如果未登录或者没有权限,将会重定向到登录页面。
其中 [Authorize] 特性是 ASP .Net MVC 自带的身份验证特性,如果用户没有登录或权限不足,则会将该请求重定向到登录页面。
[Authorize(Roles = "admin")]
public class AdminController : Controller
{
public ActionResult Index()
{
return View();
}
}
2. 动作级别
在动作层级上应用过滤器,可以对该动作进行单独的过滤。
与控制器过滤器类似,我们也可以创建一个继承于 ActionFilterAttribute 的动作过滤器,并在需要应用该动作过滤器的动作上使用特性进行标记。
在下面的代码片段中,我们已经创建了一个自定义的动作过滤器 MyActionFilter,该过滤器会在执行动作前后分别打印日志。
public class MyActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Debug.WriteLine("动作执行前:" + filterContext.ActionDescriptor.ActionName);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Debug.WriteLine("动作执行后:" + filterContext.ActionDescriptor.ActionName);
}
}
public class HomeController : Controller
{
[MyActionFilter]
public ActionResult Index()
{
return View();
}
}
在上面的代码中,我们在 Index 方法上使用了 MyActionFilter 特性,表示该动作会被该过滤器进行拦截,并执行 OnActionExecuting 和 OnActionExecuted 方法中的代码。
2.1 实现动作级别的身份验证
可以通过在动作上添加 [Authorize] 特性,实现动作级别的身份验证。如果用户未登录或者没有权限,将会重定向到登录页面。
在下面的代码片段中,我们在 Admin 方法上添加了 [Authorize(Roles = "admin")] 特性,表示该动作只有 admin 角色的用户才有权限访问。
public class HomeController : Controller
{
[Authorize(Roles = "admin")]
public ActionResult Admin()
{
return View();
}
}
3. 全局级别
在全局层级上应用过滤器,可以对所有控制器和所有动作进行过滤。
我们可以在 Global.asax 文件的 Application_Start 方法中,注册全局过滤器。
在下面的代码片段中,我们已经注册了一个自定义的全局过滤器 MyGlobalFilter,该过滤器会在执行动作前后分别打印日志。
public class MyGlobalFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Debug.WriteLine("动作执行前:" + filterContext.ActionDescriptor.ActionName);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Debug.WriteLine("动作执行后:" + filterContext.ActionDescriptor.ActionName);
}
}
protected void Application_Start()
{
GlobalFilters.Filters.Add(new MyGlobalFilter());
}
在上面的代码中,我们在 Application_Start 方法中注册了 MyGlobalFilter 全局过滤器,表示所有控制器和所有动作都会被该过滤器进行拦截,并执行 OnActionExecuting 和 OnActionExecuted 方法中的代码。
3.1 实现全局级别的身份验证
可以在 Global.asax 文件的 Application_Start 方法中,注册一个全局的身份验证过滤器。
在下面的代码片段中,我们已经注册了一个全局的身份验证过滤器,表示所有控制器和所有动作都需要进行身份验证,否则将会重定向到登录页面。
protected void Application_Start()
{
GlobalFilters.Filters.Add(new AuthorizeAttribute());
}
ASP .Net MVC 中的过滤器,可以在不同的层级进行应用,从而帮助我们实现对请求和响应的管控,开发过滤器是进行权限控制等必备技能。