SNP.NET MVC 做一个简单得非法登陆拦截

非法登陆拦截,主要用到得是.net mvc 里过滤器。我们每次在执行一个方法得时候,实际上程序会预先对我们设置得一些过滤条件进行验证和判断,而不同得过滤器作用得优先级不同,在实现拦截功能得时候,用到得主要是全局过滤器(不了解,不详述)。

代码:在app_start文件下FilterConfig.cs文件中注册一个全局过滤器——检测登陆授权。

 

using Console.App_Start;

 

using System.Web;

using System.Web.Mvc;

 

namespace Console

{

    public class FilterConfig

    {

        /// <summary>

        /// 注册全局过滤器

        /// </summary>

        /// <param name="filters"></param>

        public static void RegisterGlobalFilters(GlobalFilterCollection filters)

        {

            //filters.Add(new HandleErrorAttribute());

            //登录授权

            filters.Add(new AuthFilter());

        }

    }

}

 

注册一个名为AuthFilter得过滤器,每次执行动作前,都必须先通过这个过滤器审核。

在app_start下新建一个名为AuthFilter.cs的类,在这里授权条件,

 

using Console.Util;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Mvc;

 

namespace Console.App_Start

{

    public class AuthFilter:ActionFilterAttribute

    {

        public override void OnActionExecuting(ActionExecutingContext filterContext)

        {

            //如果用户未登录,且action未明确标识可跳过登录授权,则跳转到登录页面

            if (!CacheUtil.IsLogin&&!filterContext.ActionDescriptor.IsDefined(typeof(AuthEscape),false))

            {

                const string loginUrl = "~/Main/Login";

                filterContext.Result = new RedirectResult(loginUrl);

            }

            base.OnActionExecuting(filterContext);

        }

    }

}

重点看下面这一句:

 //如果用户未登录,且action未明确标识可跳过登录授权,则跳转到登录页面

 if (!CacheUtil.IsLogin&&!filterContext.ActionDescriptor.IsDefined(typeof(AuthEscape),false))

 这是一个条件表达式,前一句 CacheUtil.IsLogin 是一个bool类型的值,为true则表示已经登录,为false则表示未登录,!CacheUtil.IsLogin表示未登录的意思,后一句 

filterContext.ActionDescriptor.IsDefined(typeof(AuthEscape),false))

 这里重要的其实是这个 AuthEscape,这是一个定义过滤器特性的类,在这个我们只把它作为一个标志,作为一个可以免除登录授权的标志,具体使用是这样的,比如,看下图:

 

 我们在执行任何一个方法之前都会经过全局过滤的过滤,只有已经登录的用户才能执行action方法。但是,因为我们的登录信息是在登录之后才被记录的,那我们的登录操作,登录校验的操作不就也被挡在外面了吗,这样一来,岂不是永远无法登录了吗。所以呀,为了解决这个问题,我们就需要给这两个方法每人发一块免检通行证,也就是在他们头上写一个[AuthEscape],只要有了这个标志,那么上面的那句代码就会返回一个true,如果没有,那么就会返回false。假如既没有登录,又没有免检通行证,那么就会被拦在登录界面上。

AuthEscape.cs的代码如下:

 

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Mvc;

 

namespace Console.App_Start

{

    /// <summary>

    /// 用于标记无需登录授权验证的Action,无任何实现,在那个action上面标注这个,就可以逃过全局过滤器的过滤

    /// </summary>

    public class AuthEscape:ActionFilterAttribute

    {

 

    }

}

 是的,这个类里面是空的,因为我们并不需要这里有任何内容,我们只需要在免检的方法上挂上这个类的名字,仅此而已。这一整个流程,可以用如下的示意图来简要表示:

 

 

 

 

 

 

posted @ 2020-04-30 14:45  孤者何惧`  阅读(171)  评论(0)    收藏  举报