我正在使用一个使用ASP.NET MVC 5和ASP.NET Web API的项目。基本上,纯javascript Ajax调用用于在单独的项目中访问Web API(而不是MVC Controller)。使用sessionStorage.setItem(而不是HttpContext.Current.Session)将返回当前用户标识和角色保存为会话。 MVC内部控制器的整个点仅用于返回视图。
我面临的挑战是如果用户未针对视图进行身份验证,则将用户重定向到404页面而不会闪烁。目前,sessionStorage.getItem用于确定用户是否在特定cshtml文件中进行了身份验证。由于它是一个javascript解决方案,它会闪烁并在重定向到404之前显示页面。
我知道MVC 5本身带有控制器的授权属性,但它似乎不适用于这种情况。此外,这个项目的结构基本上是固定的,我不允许将sessionStorage.setItem更改为HttpContext.Current.Session。
鉴于上述限制,我似乎无法找到解决方案。
注意:如果用户未经过身份验证,最终结果是在呈现页面之前返回404页面。希望有人可以帮忙解决这个问题。
答案 0 :(得分:0)
您可以使用Attributes
public class CheckSession : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//if cookie does not exist, redirect to 404 in error controller
if(!HttpContext.Current.Request.Cookies.AllKeys.Contains("myCookie"))
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary() { { "controller", "Error" }, { "action", "Some404view" } });
base.OnActionExecuting(filterContext);
}
}
然后用
装饰你的动作[CheckSession()]
public ActionResult SomeAction()
{
}