MVC4自定义授权过滤器如何对免登录用户跳过session检查

问题描述

本人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不就好了。

时间: 2024-11-01 21:52:56

MVC4自定义授权过滤器如何对免登录用户跳过session检查的相关文章

play for scala 实现SessionFilter 过滤未登录用户跳转到登录页面_java

一.编写SessionFilter.scala代码 package filters import javax.inject.{Inject, Singleton} import akka.stream.Materializer import controllers.routes import play.api.mvc.{Filter, RequestHeader, Result, Results} import scala.concurrent.Future @Singleton class S

使用AngularJS创建自定义的过滤器的方法

  这篇文章主要介绍了使用AngularJS创建自定义的过滤器的方法,AngularJS是非常热门的JavaScript库,需要的朋友可以参考下 Angularjs过滤器是 angularjs非常棒的特性之一.有朝一日,你可能需要使用自定义过滤器,幸运的是,你找到了这篇博文. 下面显示的是自定义过滤器长什么样子(请注意myfilter): 我们的自定义过滤器叫做 "myfilter", 它有由 ':'隔开的4个参数. 这是一个将会用到的样本输入: ? 1 2 3 4 5 6 $scop

微博爬虫“免登录”技巧详解及Java实现

一.微博一定要登录才能抓取? 目前,对于微博的爬虫,大部分是基于模拟微博账号登录的方式实现的,这种方式如果真的运营起来,实际上是一件非常头疼痛苦的事,你可能每天都过得提心吊胆,生怕新浪爸爸把你的那些账号给封了,而且现在随着实名制的落地,获得账号的渠道估计也会变得越来越少. 但是日子还得继续,在如此艰难的条件下,为了生存爬虫们必须寻求进化.好在上帝关门的同时会随手开窗,微博在其他诸如头条,一点等这类新媒体平台的冲击之下,逐步放开了信息流的查看权限.现在的微博即便在不登录的状态下,依然可以看到很多微

link环境下在用codefirst制作《网盘软件》,如何实现免登录框的设置?

问题描述 link环境下在用codefirst制作<网盘软件>,如何实现免登录框的设置? link环境下在用codefirst制作<网盘软件>,如何实现免登录框的设置? 解决方案 你说的是记住密码么http://www.cnblogs.com/ylwn817/articles/2029400.htmlhttp://blog.csdn.net/cyanapple_wen/article/details/5417561http://www.cnblogs.com/ou444/archi

easyui跳回登录界面-.net中 easyui在mvc过滤器处理报错时怎么跳回到登录界面

问题描述 .net中 easyui在mvc过滤器处理报错时怎么跳回到登录界面 .net中 easyui在mvc过滤器处理报错时怎么跳回到登录界面 我用mvc的过滤器做了一个全局的异常处理,前台是用的easyui框架,报错后想跳回登录界面,可是一直跳转不出去求大神帮忙解决 跳转方法: public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new LoginCheckFilterA

关于远程桌面登陆提示“连接被拒绝,因为没有授权此用户账号进行远程登录”

继续跟着教材做实验. 在域环境下,域用户使用远程桌面方式登录域控本地,提示"连接被拒绝,因为没有授权此用户账号进行远程登录"   域控本地安全策略 - 本地策略 - 用户权限分配 - 允许通过远程桌面服务登陆,已经添加域用户所属组. 最后发现是隶属的组不属于Remote Desktop Users组,添加上即可.

openid-微信授权提示 ”近期你已经授权登陆过XXXXX 自动登录中“,如何不让这句话出来

问题描述 微信授权提示 "近期你已经授权登陆过XXXXX 自动登录中",如何不让这句话出来 微信网页授权登陆,第一次用户授权后,用户再次进入页面时,如何判断已经授权过了.即点击页面的登陆按钮不再跳转到授权页,也不再提示用户近期你已经授权登陆过,求解答! 像那些砍价页面,你进去之后,他怎么知道你本人有没有砍过?我觉得是用openid,但是我不希望用户每次打开都是跳转到授权页面,也就是不希望每次都出现"近期你已经授权登陆过XXXXX 自动登录中"这句话. 解决方案 你用

php /thinkphp 如何实现 账号只能在指定的电脑上登录,没有授权的电脑是无权登录的?

问题描述 php /thinkphp 如何实现 账号只能在指定的电脑上登录,没有授权的电脑是无权登录的? php /thinkphp 如何实现 账号只能在指定的电脑上登录,没有授权的电脑是无权登录的? 解决方案 这个有点难搞吧,毕竟你的项目是基于服务器的,不是位于客户端,你的服务器无法直接获取客户端本地的信息的吧,除非你安装控件,这又是其他语言的事情了.你在研究研究呗 解决方案二: 一般没法做 , PHP是运行在服务器上面的. 用户通过电脑等设备的浏览器访问 服务器 ,服务器把请求转交给PHP来

[WCF权限控制]利用WCF自定义授权模式提供当前Principal[实例篇]

在<原理篇>中我们谈到:如果采用自定义安全主体权限模式,我们可以通过自定义AuthorizationPolicy或者ServiceAuthorizationManager实现对基于当前认证用于相关的安全主体的提供,进而达到授权的目的.为了让大家对此有个更加深刻的认识,在这篇文章中我们会提供一个具体的例子.[源代码从这里下载] 目录: 一.创建自定义AuthorizationPolicy 二.创建自定义ServiceAuthorizationManager 三.通过自定义Authorizatio