MVC本身就提供了一个登陆、注册以及权限认证的功能,但是自带的功能无法满足我们的需要,你去看它的四张表,短的实在是不敢恭维了。
因此一般我都是把AcountController的相关的东西都删了,一步一步自己来重建自己的登陆模块。
MVC提供了四种Filter(钩子),用于在Action执行之前或者之后,我们能够做一些事情,比如说判断有没有登录,比如说判断有没有权限。
IAuthorizationFilter:在所有Filter和Action执行之前执行
IActionFilter:分别在Action执行之前和之后执行。
IResultFilter:分别在Action Result执行之后和之前
IExceptionFilter:只有在filter,或者 action method, 或者 action result 抛出一个异常时候执行
做登录验证,用IAuthorizationFilter应该是最好的选择,比如系统自带的登陆与权限验证,就是用这个做的。但是我们今天要讲的是如何用ActionFilter做登录的验证。
我们转到Controller的定义的时候,发现是这样子的:
public abstract class Controller : ControllerBase, IActionFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter, IAsyncController, IController, IAsyncManagerContainer
看到IActionFilter接口了木有,这让我们找到一个思路:新建一个基类,在该类中重载OnActionExecuting方法,这样子整个在所有Action执行之前都会先判断权限了:
public class BaseController : Controller { // // GET: /Base/ protected override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.HttpContext.Request.Cookies["UserID"] == null) { if (this.RouteData.Values["Controller"].ToString() != "Login" ) { //跳转到登陆页 filterContext.Result = new RedirectResult("/Login/Index"); } } base.OnActionExecuting(filterContext); } }
如上代码通过判断Cookies中的UserID来判断用户是否登陆,如果没有登陆,就跳转到Login/Index中去。你将其它所有需要验证登陆的controller继承自baseController就可以实现判断登陆了。
但是LoginController只能够直接继承自Controller,否则程序判断你没有登陆,然后跳转到Login,但是在Login实现Index之前,程序判断你仍然没有登陆,于是又跳转到Login,实现了一个死循环。
如无特别说明,本博客文章皆为原创。转载请说明,来自吵吵博客。
原文链接:http://chaochaoblog.com/archives/2853
吵吵微信朋友圈,请付款实名加入: