自定义过滤器无限执行:登录校验过滤器引发重定向循环
解决自定义登录校验过滤器的重定向循环问题
嘿,我来帮你搞定这个重定向循环的坑!咱们先拆解问题根源,再给出修复方案:
问题根源分析
你的过滤器现在陷入无限循环,核心原因有两个:
- 逻辑反向:登录校验的常规逻辑应该是「未登录(无
TypeCookie)时重定向到登录页」,但你现在写的是「有TypeCookie时就重定向到Admin/Index」,这完全搞反了方向。 - 无排除逻辑:如果这个过滤器被应用到了
Admin/Index这个Action上(不管是全局注册还是直接加特性),每次访问Admin/Index都会触发过滤器,然后又被重定向回Admin/Index,形成无限循环。
修复后的代码示例
public class CustomeFilterForAdmin : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { // 获取当前请求的控制器和动作名称,用来判断是否已经在目标页面 string currentController = filterContext.RouteData.Values["controller"].ToString(); string currentAction = filterContext.RouteData.Values["action"].ToString(); // 如果当前已经是Admin/Index页面,直接跳过过滤器逻辑,避免循环 if (currentController.Equals("Admin", StringComparison.OrdinalIgnoreCase) && currentAction.Equals("Index", StringComparison.OrdinalIgnoreCase)) { base.OnActionExecuting(filterContext); return; } // 修正登录校验逻辑:没有Type Cookie时,重定向到登录页(假设登录页是Admin/Login) if (filterContext.HttpContext.Request.Cookies["Type"] == null) { filterContext.Result = new RedirectToRouteResult( new RouteValueDictionary { { "controller", "Admin" }, { "action", "Login" } }); } // 如果存在Type Cookie,说明已登录,让请求继续执行后续逻辑即可 } }
额外注意事项
- 过滤器注册范围:如果是全局注册了这个过滤器(比如在
FilterConfig.cs里添加了filters.Add(new CustomeFilterForAdmin());),一定要保留上面的「当前页面判断」逻辑;如果只是给需要校验的Action单独加[CustomeFilterForAdmin]特性,记得不要给Admin/Index和Admin/Login加这个特性。 - Cookie有效性校验:建议不要只判断Cookie是否存在,最好还要校验Cookie的内容是否合法(比如是否是有效的用户类型标识),避免伪造Cookie绕过校验。
内容的提问来源于stack exchange,提问作者Raj Kumar
相关产品推荐
相关产品推荐

