利用MVC5 Filter实现登录状态的判断

本文介绍了如何在ASP.NET MVC5中自定义LoginCheckAttribute过滤器来判断用户登录状态。通过检查Session中的UserName是否为空,决定是否重定向到登录页面。使用IAuthorizationFilter提供更灵活的权限控制,而非简单的AuthorizeAttribute。示例展示了如何在登录Controller中添加验证控制,以及如何扩展过滤器应用到整个控制器。

原文地址:https://www.jeremyjone.com/356/,转载请注明出处。

1、定义LoginCheckAttribute过滤器类

利用Session的键值UserName是否为null判断用户是否登录过,如果登录继续,如果没有,跳转到登录页

public class LoginCheckAttribute : FilterAttribute, IAuthorizationFilter
{
     public void OnAuthorization(AuthorizationContext filterContext)
     {
         // 执行Action之前调用此方法
         var user = filterContext.HttpContext.Session["UserName"];
         if (user == null)
         {
             // filterContext.HttpContext.Response.Redirect("/Home/Login");
             string url = new UrlHelper(filterContext.RequestContext).Action("Login", "Home");
             filterContext.Result = new RedirectResult(url);
         }
     }

     public void OnAuthenicationChallenge(System.Web.Mvc.Filters.AuthenticationChallengeContext filterContext)
     {
         // 在执行Action之后调用此方法
     }
 }

两个方法,一个是在Action被执行之前调用,一个是在Action被执行之后,返回视图之前执行,注意区别。

使用IAuthorizationFilter比直接使用内置的AuthorizeAttribute更加灵活。当我们需要在登录验证中实现扩展的时候,IAuthorizationFilter会更加方便扩展。相对来说,AuthorizeAttribute的核心函数AuthorizeCore只返回一个bool值类型,并不能更加细节的体现权限控制。

2、定义登录Action并添加验证控制

在登录的Controller中添加三个Action用于测试,一个主页,一个GET方法登录页,一个POST方法登录页。

public class HomeController : Controller
{
     [LoginCheck]  // 主页需要登录验证,未登录跳转到登录页
     public ActionResult Index()
     {
         ViewBag.Message = Session["UserName"];  // 成功登录会显示用户名
         return View();
     }

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

     [HttpPost]
     public ActionResult Login(string username, string password)
     {
         EmployeeContext EmployeeDB = new EmployeeContext("192.168.1.16", "jeremyjone", "123456");
         bool res = EmployeeDB.LoginCheck(username, password);  // 返回数据库的验证结果

         if (res)
         {
             Session["UserName"] = username;  // 将用户添加到Session中
             return RedirectToAction("Index", "Home");  // 成功直接跳转页面
         }
         ViewBag.ErrorMessage = "输入无效";
         return View();
     }
 }

用户登录主页时,会首先进行之前写好的登录验证,如果没有登录,会跳转到登录页。登录页验证成功后,会将用户名添加到Session中,注意Session的KEY值需要保持一致,当然,也可以使用Cookie,不过我并不推荐。登陆之后会成功跳转到主页,主页面会显示出当前登录用户名。

3、扩展需要

上面代码可以方便控制主页的登录验证,如果整个控制器都需要登录验证,那么直接在类名上面套用过滤器即可。

[LoginCheck]  // 整个控制器的所有Action都需要验证登录情况
public class EmployeeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    // ...省略其他代码
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值