MVC过滤器 AuthorizeAttribute使用

APS.NET MVC中(以下简称“MVC”)的每一个请求,都会分配给相应的控制器和对应的行为方法去处理,而在这些处理的前前后后如果想再加一些额外的逻辑处理。这时候就用到了过滤器。

过滤器类型

接口

描述

Authorization

IAuthorizationFilter

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

Exception

IExceptionFilter

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

Action

IActionFilter

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

Result

IResultFilter

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

过滤器

类名

实现接口

描述

ActionFilter

AuthorizeAttribute

IAuthorizationFilter

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

HandleError

HandleErrorAttribute

IExceptionFilter

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

自定义

ActionFilterAttribute

IActionFilter和IResultFilter

用于进入行为之前或之后的处理或返回结果的之前或之后的处理

   授权管理器AuthorizeAttribute已经实现了IAuthorizationFilter接口,我们直接可以使用 Authorize实现登录校验

在home控制器的Index 方法上 打上[Authorize]特性标签,

        [Authorize]       
        public ActionResult Index()
        {
            return View();
            
        }

然后配置文件里面:

   <authentication mode="Forms">
      <forms loginUrl="/Login/login" timeout="2"  />
    </authentication>

这时候访问localhost:1757/Home/Index的时候就会直接跳转到登录页。

那么我们模拟一下给登录账户授权:

        [HttpPost]      
        public JsonResult loginValidate(string username, string password)
        {
            object o = new { reslut = "正确" };
            FormsAuthentication.SetAuthCookie(username, true);
            //数据库验证 逻辑处理
             return Json(o, JsonRequestBehavior.AllowGet);
        }
FormsAuthentication.SetAuthCookie(username, true); 第二个参数,true代表持久cookies 根据你配置文件timeout的值进行过期时间验证,超过timeout规定时间就的重新登录 false
代表回话cookie浏览器退出,就需要重新登录。

这里我设置了 timeout=2 那么 过期时间就为2分钟。也就是说两分钟后需要重新登录。

    进阶:

     默认的授权过滤器,不灵活,我们可以自定义过滤器, 创建一个类CheckLoginAttribute 继承自 AuthorizeAttribute

 public class CheckLoginAttribute : AuthorizeAttribute
    {
       

        //过程请求授权
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            var attrs = filterContext.ActionDescriptor.GetCustomAttributes(typeof(AllowLoginAttribute), true);
            if (attrs.Count() > 0)
            {
                return;
            }
            User user = WebHelper.GetLoginedUser();

            if (user==null)
            {
//跳转登录页 filterContext.Result
= new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Login", action = "login" })); } } }

    自定义过滤器写好了, 我们可以使用 CheckLogin 给控制器 或者方法打上标签, 但是 我们又多个控制器, 很多个方法, 一个一个太费事,

mvc有自己的全局过滤器,我们可以把自定义的过滤器注册到 FilterConfig.cs 中去。

filters.Add(new CheckLoginAttribute());

此时运行发现, 所有的控制器,方法 都被过滤掉了。怎么让指定的控制器,或者方法 可以被访问呢,

我这里 使用了,再创建一个特性,来标识这个方法可以访问,

 public class AllowLoginAttribute : Attribute
    {
    }

然后写在登录方法上。

public class LoginController : Controller
    {
        //
        // GET: /Login/
        [AllowLogin]
        public ActionResult login()
        {
            return View();
        }

        [HttpPost]
        [AllowLogin]
        public JsonResult loginValidate(string username, string password)
        {
            object o = new { reslut = "正确" };
            FormsAuthentication.SetAuthCookie(username, true);
            //数据库验证 逻辑处理

            //写session
            Model.User user = new Model.User();
            user.username = username;
            user.password = password;
            Session.Add("LoginSession", user);

            return Json(o, JsonRequestBehavior.AllowGet);
        }
    }

 登录的记录到session  如果没有登录,就会自动跳转到登录页。

  过滤器是一种面向切面AOP思想的编程,很方便。


原文地址:https://www.cnblogs.com/ZeedLee/p/9598344.html