• 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思想的编程,很方便。

    
    
  • 相关阅读:
    MATLAB 制作gif动画
    MATLAB求解浸润角
    MATLAB 解代数方程组
    空间直线同任意形状椭球交点
    空间旋转——四元数表示
    坐标系旋转 & 坐标点旋转
    展开循环来加速计算
    空间直线同球体交点求解
    变量初始化问题
    python 实现多个线程间消息队列传递,一个简单的列子
  • 原文地址:https://www.cnblogs.com/ZeedLee/p/9598344.html
Copyright © 2020-2023  润新知