ASP.Net MVC Filter验证用户登录

2023-05-11,,

一、Filter是什么

ASP.NetMVC模式自带的过滤器Filter,是一种声明式编程方式,支持四种过滤器类型,各自是:Authorization(授权),Action(行为),Result(结果)和Exception(异常)。

过滤器类型

接口

描写叙述

Authorization

IAuthorizationFilter

此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法

Exception

IExceptionFilter

用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常

Action

IActionFilter

用于进入行为之前或之后的处理

Result

IResultFilter

用于返回结果的之前或之后的处理

可是默认实现它们的过滤器仅仅有三种,各自是ActionFilter(方法),Authorize(授权),HandleError(错误处理)。各种信息例如以下表所看到的:

过滤器

类名

实现接口

描写叙述

ActionFilter

AuthorizeAttribute

IAuthorizationFilter

此类型(或过滤器)用于限制进入控制器或控制器的某个行为方法

HandleError

HandleErrorAttribute

IExceptionFilter

用于指定一个行为,这个被指定的行为处理某个行为方法或某个控制器里面抛出的异常

自己定义

ActionFilterAttribute

IActionFilter和IResultFilter

方法运行前/后的处理。                             返回结果的之前或之后的处理。

第三种自己定义的过滤器,一定要继承ActionFilterAttribute。

它是ASP.NETMVCFramework提供的基类ActionFilterAttribute。这个类实现了IActionFilter和IResultFilter接口。ActionFilterAttribute有下面几个方法能够重写:

OnActionExecuting

在controller action运行之前调用

OnActionExecuted

在controller action运行之后调用

OnResultExecuting

在controller action result运行之前调用

OnResultExecuted

在controller action result运行之后调用

实现每一个页面都验证cookie中是否存实用户信息。过期用户信息就失效,跳转登录页面。

总体思路是这种:先在登录Controller中把页面传来的User信息保存到cookie中,设置cookie失效时间。每一个Controller中的方法运行都会先运行Filter。查看cookie中是否存实用户信息。

二、实践 

首先要把username信息保存到cookie中。在登录的Controller中创建cookie。cookie是一种键值对模式(key, value)。

#region 将username存到cookie中
/// <summary>
/// 保存Cookie
/// </summary>
/// <returns></returns>
public void CreateCookie()   //此Action自己主动往cookie里写入登录信息
{
HttpCookie UserName = new HttpCookie("name");
UserName.Value = Request["userName"];
System.Web.HttpContext.Current.Response.SetCookie(UserName);
//cookie保存时间
UserName.Expires = DateTime.Now.AddHours(10);
}
#endregion

其次,在Filter中创建自己定义的的LoginFilter,检查cookie是否实用户信息:

    //类和方法都使用时,加上这个特性,此时都其作用,不加。仅仅方法起作用
[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)]
public class LoginFilter:ActionFilterAttribute
{
/// <summary>
/// OnActionExecuting是Action运行前的操作
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//推断Cookieusernamepassword是否存在
HttpCookie cookieName = System.Web.HttpContext.Current.Request.Cookies.Get("name");
if ( cookieName == null)
{
filterContext.Result = new RedirectResult("/Login/Index");
}
}
}

最后,要在每一个Controller中打下自己定义的Filter的标签

<span style="font-size:18px;">    [LoginFilter]
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "欢迎使用 ASP.NET MVC!"; return View();
}
</span>

在Controller上打了标签,下边的全部方法运行前都会先运行Filter,实现了过滤。可依据自己的业务。调整标签;或是使用全局的Global。

这次的Filter学习,暴露了我的一个缺点,调试bug,遇到红色波浪线就ctrl + z 撤销,而不是去认真的看问题,解决这个问题。自检!

ASP.Net MVC Filter验证用户登录的相关教程结束。

《ASP.Net MVC Filter验证用户登录.doc》

下载本文的Word格式文档,以方便收藏与打印。