Asp.NET MVC 4中的会话

Waq*_*med 0 c# asp.net session asp.net-mvc-4

任何人都可以告诉我如何在asp.net MVC 4中处理会话.我知道这个Session变量,我知道如何使用它.

Session["login"] = true; //We can use it in controller to check the whether user logged in or not.
Run Code Online (Sandbox Code Playgroud)

上面的代码片段足以处理小型Web应用程序上的会话.但是,如果我有很多控制器和操作,并且我正在处理大型应用程序,那么该怎么办?在这种情况下,我不能在每个操作中使用会话变量.

是否有任何通用的地方我可以检查我的会话变量或任何其他解决方案?

Ehs*_*jad 5

第一道:

我以前编写了一个基本控制器类,所有其他控制器继承了它,需要在访问之前进行身份验证:

public class DefaultController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Session["User"] == null)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.HttpContext.Response.StatusCode = 403;
                filterContext.Result = new JsonResult { Data = "LogOut", JsonRequestBehavior = JsonRequestBehavior.AllowGet };
            }
            else
                filterContext.Result = RedirectToAction("Login", "Account");
        }
        else
        {
            //base.Execute(filterContext.RequestContext);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并从用户必须登录的基础控制器继承:

public class LeaveController : DefaultController
{

}
Run Code Online (Sandbox Code Playgroud)

另一种方法是编写自己的authorizaion属性.

请参阅asp.net mvc中的过滤器和属性

第二种方式:

以下是自定义过滤器属性的示例,创建继承自ActionFilterAttribute以下内容的类:

public class SessionTimeoutAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.HttpContext.Session["someValueYouLookFor"] == null)
        {
            filterContext.Result = new RedirectResult("~/Home/Index"); // redirect to login action
        }
        else
        {
            // continue normal execution 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并把它放在控制器或动作上:

[SessionTimeout]
public ActionResult Index()
{


}
Run Code Online (Sandbox Code Playgroud)