在.Net Mvc C#中递归执行的动作过滤器

时间:2018-07-18 05:46:18

标签: c# model-view-controller routing attributes action-filter

我有一个自定义的动作过滤器,该过滤器用于通过检查用户的cookie,然后将cookie发送到服务器来对用户进行身份验证,并获取有关用户是否存在的响应,或者是否使用网络api调用。

我已经用如下的Action过滤器装饰了控制器:

管理控制器

[CheckuserAuthenticateelseRedirect]

public class AdminController : Controller
{
//All actions goes here
}

这是Model内的Action过滤器类

动作过滤器

 public class CheckuserAuthenticateelseRedirect: System.Web.Mvc.ActionFilterAttribute
 {
   public override void OnActionExecuting(ActionExecutingContext filterContext)
   {
        base.OnActionExecuting(filterContext);
        var userCokiesData = getUserCokiesData();
        if (userCokiesData==null)
        {



            var controller = (AdministratorBlog.Controllers.AdminController)filterContext.Controller;
            filterContext.Result = controller.RedirectToAction("login", "Admin");

        }
        else
        {
            var userdata = getuserDateByEmail(userCokiesData.username, 3, WebSiteID);
            if (userdata==null)
            {

            var controller = (AdministratorBlog.Controllers.AdminController)filterContext.Controller;
            filterContext.Result = controller.RedirectToAction("login", "Admin");


            }
        }
        base.OnActionExecuting(filterContext);


    }

  private UsersTB getuserDateByEmail(string email, int userTypeId, int siteid)
  {
       //return User if exist else null
  }
   private getCookiesModel getUserCokiesData()
   {
    //read  cookies
   }
}

问题

发出请求后,Actionfilter会执行,如果cookie为null,它将请求发送到登录视图,但是在返回视图“ OnActionExecuting” 方法之前,该方法一次又一次被调用,结果是没有响应。请帮助这里出什么问题。

1 个答案:

答案 0 :(得分:1)

问题是您已应用过滤器CheckuserAuthenticateelseRedirect来完成控制器,因此当没有Cookie命中的用户点击时,操作会将其发送到Login操作,然后再次使用相同的过滤器,从而调用{{ 1}}递归。

修复是,您应该停止将OnActionExecuting操作绑定到过滤器,因为未经身份验证的用户将点击该过滤器,并且他们将永远不会拥有Cookie。