You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义过滤器无限执行:登录校验过滤器引发重定向循环

解决自定义登录校验过滤器的重定向循环问题

嘿,我来帮你搞定这个重定向循环的坑!咱们先拆解问题根源,再给出修复方案:

问题根源分析

你的过滤器现在陷入无限循环,核心原因有两个:

  1. 逻辑反向:登录校验的常规逻辑应该是「未登录(无Type Cookie)时重定向到登录页」,但你现在写的是「有Type Cookie时就重定向到Admin/Index」,这完全搞反了方向。
  2. 无排除逻辑:如果这个过滤器被应用到了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:51:23