我有一个自定义的动作过滤器,该过滤器用于通过检查用户的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” 方法之前,该方法一次又一次被调用,结果是没有响应。请帮助这里出什么问题。
答案 0 :(得分:1)
问题是您已应用过滤器CheckuserAuthenticateelseRedirect
来完成控制器,因此当没有Cookie命中的用户点击时,操作会将其发送到Login
操作,然后再次使用相同的过滤器,从而调用{{ 1}}递归。
修复是,您应该停止将OnActionExecuting
操作绑定到过滤器,因为未经身份验证的用户将点击该过滤器,并且他们将永远不会拥有Cookie。