zoukankan      html  css  js  c++  java
  • 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思想的编程,很方便。

    
    
  • 相关阅读:
    数据结构-查找-有序查找
    发现新大陆 --21lic
    专利检索
    IT行业新闻事件
    流量校准仪开发日志-2017-10-24
    电池充电方案总结
    iOS中创建自定义的圆角按钮
    iOS 内存管理实践
    iOS 内存管理策略
    [置顶] 内存管理一点也不神秘————手绘iOS内存管理细节
  • 原文地址:https://www.cnblogs.com/ZeedLee/p/9598344.html
Copyright © 2011-2022 走看看