在 ASP .Net MVC C# 中可以应用过滤器的级别是什么?

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 中的过滤器,可以在不同的层级进行应用,从而帮助我们实现对请求和响应的管控,开发过滤器是进行权限控制等必备技能。

后端开发标签