MVC | 登陆过滤器

登陆过滤器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MvcAppFilter.Filters
{
    using System.Web.Mvc;

    //自定义一个MyAuAttribute,让这个类继承AuthorizeAttribute类,那么这个类就成了一个登陆验证过滤器
    public class MyAuAttribute : AuthorizeAttribute
    {
        //重写父类OnAuthorization方法。我们在这里来判断用户名Session是否为空,如果如果为空就说明用户未登陆,我们就可以让它跳转到登陆页面。
        public override void OnAuthorization(AuthorizationContext filterContext)
        {

            /*
            if (filterContext.ActionDescriptor.ActionName != "Login")
            {
                //如果登陆Session为空的话
                if (filterContext.HttpContext.Session["Login"] == null)
                {
                    filterContext.Result = new RedirectResult("/Home/Login");
                }
            }
            */


            //如果你访问的控制器类上有打上[SkipCheckLogin]特性标签
            //if (filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(LoginAttribute), false))
            //{ 

            //}


            //如果你访问的Action上有打上了[SkipCheckLogin]特性标签
            if (filterContext.ActionDescriptor.IsDefined(typeof(SkipCheckLoginAttribute), false))
            {
                //如果登陆Session为空的话
                if (filterContext.HttpContext.Session["Login"] == null)
                {

                    //第一种> 跳转到登陆页面(页面URL会变成 http://localhost:59075/Home/Login)
                    filterContext.HttpContext.Response.Redirect("/Home/Login");

                    //第二种> 或者用这种(页面URL会变成 http://localhost:59075/Home/Login)
                    ContentResult cr = new ContentResult();
                    cr.Content = "<script>alert('您尚未登陆,请登陆,页面即将跳转到登陆页面'); window.location='/Home/Login' </script>";
                    filterContext.Result = cr;

                    //第三种> 或者用这种:将视图的结果替换成Home控制器下的Login视图(页面URL不变,但是视图被替换了)
                    filterContext.Result = new RedirectResult("/Home/Login");

                    //第四种> 或者用这种方式(页面URL不变,但是视图被替换了)
                    ViewResult vr = new ViewResult();
                    vr.ViewName = "/Views/Home/Login.cshtml";
                    //vr.ViewName = "/Views/Shared/ToLogin.cshtml";
                    filterContext.Result = vr;
                }
            }

            //base.OnAuthorization(filterContext);
        }
    }
}

登陆过滤器完善

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FB.CMS.WebHelper.Filters
{
    using System.Web.Mvc;
    using FB.CMS.Common;
    using FB.CMS.IServices;
    using FB.CMS.Model.ModelView;
    using Autofac;
    using System.Web.WebPages;
    using FB.CMS.WebHelper.Attribute;
    using FB.CMS.Model;
    public class LoginCheckAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
         {
          
            string controllerNam = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
            //如果控制器类上有SkipCheckLoginAttribute特性标签,则直接return
            if (filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(SkipCheckLoginAttribute), false))
            {
                
                return;
            }
            //如果控action方法上有SkipCheckLoginAttribute特性标签,则直接return
             if (filterContext.ActionDescriptor.IsDefined(typeof(SkipCheckLoginAttribute), false))
            {
                return;
            }

            //sysUserInfo u = filterContext.HttpContext.Session[Keys.uinfo] as sysUserInfo;
            //如果控制器和action方法上都没有打SkipCheckLoginAttribute特性标签,则检查登陆Session是否存在
            if (filterContext.HttpContext.Session[Keys.uinfo]==null)
            {
                //如果用户没有做过记住密码的功能。则跳到登陆页面
                if (filterContext.HttpContext.Request.Cookies[Keys.isremember] == null)
                {
                    filterContext.HttpContext.Response.Redirect("/admin/Login/Login");
                    return;
                }
               

                //获取cookie中存好的用户ID(这里之所以用AInt()这个方法来将字符串转换成int类型,
                //是因为如果Cookies[Keys.isremember不存在的话,那么取到的是一个null值,如果用int.Parse(null)就会报错,
                //而用AsInt()方法,即便转换不成功,也会返回一个0,这样就不会出错了
                string uid = filterContext.HttpContext.Request.Cookies[Keys.isremember].Value;
                int userid = uid.AsInt();

                var container = CacheMgr.GetData<IContainer>(Keys.autofac); //从缓存中获取AutoFac的工作容器
                IsysUserInfoServices uinfo = container.Resolve<IsysUserInfoServices>();//从容器中获取IsysUserInfoServices类实例对象

                sysUserInfo userinfo = uinfo.QueryWhere(r => r.uID == userid).FirstOrDefault();//调用IsysUserInfoServices类的QueryWhere方法

                if (userinfo == null)
                {
                    //即便浏览器传递了一个Coookie[keys.isremember]过来,但是我们根据这个cookie的键得到值,
                    //经过数据库的查询,发现没有此用户,所以还需要跳转到登陆页面(Coookie[keys.isremember]里面保存的是用户的uId)                   
                    filterContext.HttpContext.Response.Redirect("/admin/Login/Login");
                    return;
                }

                filterContext.HttpContext.Session[Keys.uinfo] = userinfo;

            }
            else
            {
                return;
            }
        }

    }
}



Home控制器

using MvcAppFilter.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcAppFilter.Controllers
{
    public class HomeController : Controller
    {
        //自定义跳过检查登陆特性标签的使用
        [SkipCheckLogin]
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult Login()
        {
            return View();
        }


    }
}

SkipCheckLoginAttribute特性类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MvcAppFilter.Filters
{
    [AttributeUsage(AttributeTargets.Class |AttributeTargets.Method)]
    public class SkipCheckLoginAttribute:Attribute
    {

    }
}


ToLogin视图 在这个视图里也可以做跳转到登陆页面,这个视图做的比较精美,目的是放点广告,并提示用户跳转到登陆页面

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>ToLogin</title>
</head>
<body>
    <div>
        精美的广告......
    </div>

    <script>
        alert("您尚未登陆,请登陆!")
        window.location = '/Home/Login';
    </script>
</body>
</html>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值