Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model view controller MVC属性中的会话变为null_Model View Controller_Asp.net Mvc 3_Outputcache_Authorize Attribute - Fatal编程技术网

Model view controller MVC属性中的会话变为null

Model view controller MVC属性中的会话变为null,model-view-controller,asp.net-mvc-3,outputcache,authorize-attribute,Model View Controller,Asp.net Mvc 3,Outputcache,Authorize Attribute,我正在使用一个AuthorizeAttribute来检查用户是否有一个超过18岁的cookie集来访问页面 这很好,但我现在稍微扩展一下。 由于所有视图都使用此属性,我使用它来允许我尽早启动我的站点。 如果对任何URL使用add?VIEWSITE=true,它将设置一个会话变量,并允许他们访问该站点。否则,它们将被定向到等待页面 当页面第一次运行时,这可以正常工作。但是,我正在页面上使用输出缓存,下次加载页面时,我的httpcontext.session是否为null 我在属性中添加了一个“顺序

我正在使用一个AuthorizeAttribute来检查用户是否有一个超过18岁的cookie集来访问页面

这很好,但我现在稍微扩展一下。 由于所有视图都使用此属性,我使用它来允许我尽早启动我的站点。 如果对任何URL使用add?VIEWSITE=true,它将设置一个会话变量,并允许他们访问该站点。否则,它们将被定向到等待页面

当页面第一次运行时,这可以正常工作。但是,我正在页面上使用输出缓存,下次加载页面时,我的httpcontext.session是否为null

我在属性中添加了一个“顺序”变量,以确保它们以正确的顺序执行:

    [OfAge(Order = 1)]
    [OutputCache(Order = 2, Duration = 2000, VaryByParam = "categoryName")]
我属性中的狙击:

        protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        HttpRequestBase req = httpContext.Request;
        HttpResponseBase res = httpContext.Response;


        DateTime Live_Date = new DateTime(2011, 07, 01, 07, 0, 0);

        if (DateTime.Now > Live_Date || req.QueryString["VIEWSITE"] != null || httpContext.Session["VIEWSITE"] != null)
        {
            httpContext.Session["VIEWSITE"] = true;
从缓存加载页面后,我是否缺少读取/设置会话变量的功能


明确地说,是httpContext.Session为空,而不是httpContext.Session[“VIEWSITE”]

3年后,我遇到了类似的问题。现在我不是专家,但我相信每个控制器上下文调用在它自己的空间中都是唯一的,因此httpContext.Session在新调用时将为null

我的问题是以一个登录的AD用户的形式出现的,我想将该用户(使用其自定义应用程序权限)存储在会话变量中。我也在扩展AuthorizationAttribute,但是当此筛选器应用于控制器操作时,即使用户已保存,httpContext也为null

对于处理同一问题的人员,解决方法是创建一个基本控制器,在该控制器中,此用户及其会话状态在其他控制器中保持(继承基本控制器)

我的模型:

public class LoggedInUser
    {
        public somenamespace.userclass UserProfile { get; set; }
        public List<somenamespace.user_permission_class> UserPermissions { get; set; }
    }
我将在任何其他控制器操作上使用的自定义权限检查筛选器:

public class PermissionAuthorize : AuthorizeAttribute
    {
        private readonly string[] permissions;
        public PermissionAuthorize(params string[] perms)
        {
            this.permissions = perms;
        }

        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            bool auth = false;

            if (httpContext.Session["_LoginUser"] == null)
            {
                // Do nothing as auth is false.
            }
            else
            {
                // Check permissions and set auth = true if permission is valid.
                auth = true;
            }

            return auth;
        }

        /* not using
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            var tmp = filterContext.HttpContext.Session;
        }
        */
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            // Todo - direct to "unauth page"
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
用法:

public class Some_OtherController : /*PossibleNamespace?.*/ControllerBase
    {

        [PermissionAuthorize("somepermission")] // This was a CRUD application thus 1 permission per actionresult
        public ActionResult ViewWhatever()
        {
            ....
        }
    }

除此之外,这篇文章对我也有帮助。在HttpSessionStateBase(包装器)和System.Web.SessionState.HttpSessionState(asp.net 1时代的底层核心)中添加MVC语义。
public class PermissionAuthorize : AuthorizeAttribute
    {
        private readonly string[] permissions;
        public PermissionAuthorize(params string[] perms)
        {
            this.permissions = perms;
        }

        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            bool auth = false;

            if (httpContext.Session["_LoginUser"] == null)
            {
                // Do nothing as auth is false.
            }
            else
            {
                // Check permissions and set auth = true if permission is valid.
                auth = true;
            }

            return auth;
        }

        /* not using
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            var tmp = filterContext.HttpContext.Session;
        }
        */
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            // Todo - direct to "unauth page"
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
public class Some_OtherController : /*PossibleNamespace?.*/ControllerBase
    {

        [PermissionAuthorize("somepermission")] // This was a CRUD application thus 1 permission per actionresult
        public ActionResult ViewWhatever()
        {
            ....
        }
    }