模型视图控制器-会话在MVC AuthorizeAttribute中变为null



我正在使用AuthorizeAttribute来检查用户是否设置了超过18岁的cookie来访问页面。

这很好,但我现在稍微扩展一下。由于所有视图都使用此属性,我使用它可以提前启动我的网站。如果使用添加?VIEWSITE=true对于任何URL,它都会设置一个Session变量,并允许他们访问该网站。否则,它们将被引导到保留页。

第一次运行页面时效果良好。但是,我在页面上使用输出缓存,下次加载页面时,我的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为null,而不是httpContext.SSession["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 ControllerBase : Controller
    {
        private LoggedInUser _LoginUser;
        public LoggedInUser LoginUser
        {
            get 
            {
                if (_LoginUser != null)
                    return _LoginUser;
                if (Session["_LoginUser"] == null)
                    return null;
                return Session["_LoginUser"] as LoggedInUser;
            }
            set
            {
                _LoginUser = value;
                Session["_LoginUser"] = _LoginUser;
            }
        }
        public void PerformUserSetup(string sUsername) // sUsername for testing another user, otherwise User.Identity will be used.
        {
            sUsername = string.IsNullOrEmpty(sUsername) ? User.Identity.Name : sUsername;
            sUsername = (sUsername.IndexOf("\") > 0) ? sUsername.Split('\').ToArray()[1] : sUsername;
            // Todo - SQL conversion to stored procedure
            List<userclass> tmpUser = Root.Query<userclass>(/*sql to select user*/).ToList();
            List<user_permission_class> tmpUserpermissions = Root.Query<user_permission_class>(/*sql to select user permissions*/).ToList();
            LoggedInUser _LoginUser = new LoggedInUser();
            _LoginUser.UserProfile = tmpUser.First();
            _LoginUser.UserPermissions = tmpUserpermissions;
            LoginUser = _LoginUser;
        }
    }

My HomeController(任何MVC示例的标准配置):

public class HomeController : ControllerBase
    {
        [Authorize] // Standard AuthorizeAttribute (AD test)
        public ActionResult Index()
        {
            if (Session["_LoginUser"] == null)
                PerformUserSetup("");
            return View();
        }
    }

我的自定义权限检查过滤器,我将在任何其他控制器操作上使用:

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()
        {
            ....
        }
    }

相关内容

  • 没有找到相关文章

最新更新