问题描述
本人MVC新手,正在试着做权限过滤器,目前基本功能都可以实现,但是有个问题一直解决不了我通过filterContext.HttpContext.User.Identity.IsAuthenticated判断用户是否已经完成登录如果登录了就继续往下判断session是否过期,session没有过期就判断是否拥有权限可是如果用户是免登录即保存密码上来的,那么当判断到session的时候一定是null,会导致重定向到登录页。结果我就想通过filterContext.HttpContext.Request.Cookies["ASP.NET_SessionId"]取出cookie,通过判断它是否为null来看是不是免登录上来的用户,这个在调试模式一切正常,可是一旦不调试直接执行,那么该cookie就不再为null,导致永远会去判断sessin信息,结果必须重新登录,请问一下有没有人知道怎么解决这个问题,感谢了[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,AllowMultiple=false)]publicclassCustomAuthorizeFilter:AuthorizeAttribute{publicoverridevoidOnAuthorization(AuthorizationContextfilterContext){if(filterContext==null){thrownewArgumentNullException("filterContext");}#region允许匿名if(filterContext.ActionDescriptor.GetCustomAttributes(typeof(AllowAnonymousAttribute),true).Length>0|filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(AllowAnonymousAttribute),true).Length>0){//filterContext.HttpContext.SkipAuthorization=true;return;}#endregion#region是否登录if(!filterContext.HttpContext.User.Identity.IsAuthenticated)//未登录情况{ActionResultresult=newHttpUnauthorizedResult();if(filterContext.HttpContext.Request.IsAjaxRequest())//如果是Ajax操作,那么需要返回一个状态值,通过js返回指定页面{stringurl=UrlHelper.GenerateUrl("Default","Login","Home",filterContext.RouteData.Values,RouteTable.Routes,filterContext.RequestContext,true);result=newJsonResult(){Data=new{Error=true,Url=url}};}filterContext.Result=result;return;}#endregionHttpCookiesessionIdCookie=filterContext.HttpContext.Request.Cookies["ASP.NET_SessionId"];if(sessionIdCookie==null){//这里将用户权限放入session}#regionSession是否过期UserInfocurrentUser=filterContext.HttpContext.Session["currentUser"]asUserInfo;if(currentUser==null)//session过期情况{ActionResultresult=newHttpUnauthorizedResult();if(filterContext.HttpContext.Request.IsAjaxRequest()){stringurl=UrlHelper.GenerateUrl("Default","Login","Home",filterContext.RouteData.Values,RouteTable.Routes,filterContext.RequestContext,true);result=newJsonResult(){Data=new{Error=true,Url=url}};}filterContext.Result=result;return;}#endregion//后面是权限的判断}}
解决方案
解决方案二:
直接在用户cookie中写入一个“授权编号”(例如892934lkaskjdfaskfdq93241234asdkfa92)就行了。在后台根据此编号来取得用户相关的任意信息,例如当前是否登录、登录身份,购物车,访问历史,最近一共变换身份登录了几次,最后一次登录的IP,最后登录之前是否正常注销登录,等等。
解决方案三:
人家就算是所谓“免登录即保存密码上来的”,asp.net也能取得用户的profile。你抛开了asp.net本身的用户信息机制,却又用asp.net,自然是乱了。人家asp.net这里的机制根本不用Session集合。只有你自己才用Session集合。
解决方案四:
引用1楼sp1234的回复:
直接在用户cookie中写入一个“授权编号”(例如892934lkaskjdfaskfdq93241234asdkfa92)就行了。在后台根据此编号来取得用户相关的任意信息,例如当前是否登录、登录身份,购物车,访问历史,最近一共变换身份登录了几次,最后一次登录的IP,最后登录之前是否正常注销登录,等等。
我知道原本的AuthorizeAttribute的源码里是没有session判断的,但是现在问题是如果我不在自定义过滤器里判断session是否为null,就没办法做session超时返回登录页面了,除非在控制器里判断,所以我就加载特性里了,但是一旦做了这个,判断一定会走到这,那么免登录上来的用户肯定是没有相关的session信息的,就肯定会被当作session过期导向登录页
解决方案五:
用:HttpContext.Current.Session先取Session不就好了。