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