ASP.NET中cookie与Fiter实现简单登陆,AllowAnonymous匿名登陆
来源:互联网 发布:mac safari无痕模式 编辑:程序博客网 时间:2024/06/03 16:40
向服务器发送cookie
在登陆的时候,我们可以可以通过下列代码,向服务器发送cookie,其中包括自己的账号信息(不涉及加密),用以后面判断访问者.
HttpCookie cookie = new HttpCookie("userinfo");//新建一个名为userinfo的cookiecookie.Values["UserName"] = username;//向cookie中加入账号信息cookie.Values["PassWord"] = userpassword;//向cookie中加入密码信息cookie.Expires = DateTime.MaxValue;//设置cookie的可存在的时间,这里设的最长时间,cookie.Expires = System.DateTime.Now.AddDays(1);//设置存在时间1天Response.Cookies.Add(cookie);//写入cookie
过滤器Filter
并不是只有登录时我们才需要请求响应cookie,其实我们在访问任何一个页面的时候,都需要验证cookie信息,判断当前访问该页面的访问者,那么理论上,每一个控制器,每一个action,我们都需要写入关于cookie的代码,如此庞大的工作量,显然是不可能的.通过过滤器filter,这个问题引刃而解.
首先我们自定义一个过滤器
1 public class CheckLogin : ActionFilterAttribute 2 { 3 public override void OnActionExecuted(ActionExecutedContext filterContext) 4 { 5 HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("userinfo");//获取当前请求的所有cookie中名为userinfo的cookie 6 7 if (cookie==null||cookie.Values["UserName"] == null || cookie.Values["PassWord"] == null)//判断账号密码信息 8 { 9 filterContext.Result = new RedirectResult("/Account/Login");//若帐号密码为null或者cookie不存在,即返回登录页面10 }11 }12 }13 }
这个过滤器放在控制器或者action上面都可以实现验证cookie的作用,可是需要作用的控制器和action数量太多,我们就需要将该过滤器作用到全局,对所有的控制器作用.
1 public class FilterConfig 2 { 3 public static void RegisterGlobalFilters(GlobalFilterCollection filters) 4 { 5 6 filters.Add(new HandleErrorAttribute()); 7 filters.Add(new CheckLogin.CheckLogin()); 8 } 9 }10 }
1 public class MvcApplication : System.Web.HttpApplication2 {3 protected void Application_Start()4 {5 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);6 }7 }8 }
匿名访问
按照上述代码进行登陆操作,你会发现,根本找不到登录页面,原因在于,上述全局作用的过滤器,连登录页面都没有放过,就是说,你连进入登陆页面都还需要验证信息,没有信息你就返回登录页,可是登陆页你也无法访问.最后就报错.
所以对于某些特定的页面,我们需要能够匿名访问,这也是一个很实际问题,很多网页我们不需要登陆可以很轻松的访问.
对于匿名访问我们需要用到: [AllowAnonymous],能够跳过验证,实现匿名访问.
1 public class CheckLogin : ActionFilterAttribute 2 { 3 public override void OnActionExecuted(ActionExecutedContext filterContext) 4 { 5 var actionFilters = filterContext.ActionDescriptor.GetCustomAttributes(false);//获取所有的描述符 6 7 foreach (var item in actionFilters) 8 { 9 if (item.GetType().Name == "AllowAnonymousAttribute")//如果描述符类型中有AllowAnonymousAttribute(AllowAnonymous类型的名字),就直接访问,不需要验证10 {11 return;12 }13 } 14 HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("userinfo");//获取当前请求的所有cookie中名为userinfo的cookie15 16 if (cookie==null||cookie.Values["UserName"] == null || cookie.Values["PassWord"] == null)//判断账号密码信息17 {18 filterContext.Result = new RedirectResult("/Account/Login");//若帐号密码为null或者cookie不存在,即返回登录页面19 }20 }21 }
这样,我们就可以实现匿名登录,不需要验证cookie,就可以登陆一些页面.
最后,对于需要验证当前访问者的信息,那么根据取到的cookie中的账号信息,很容易就可以在数据库中找到,这里就不予说明.另外,注销账号,也可以通过过期cookie实现.
ps:才接触计算机程序,也是第一次写博客.感觉写博客是很有必要的,这是一个思考学习的过程,解决问题并不是结束,能够把它写下来,讲解给别人去解决问题,才是一个完美的结束!不过很遗憾,这次我没有做到!功力有限,积极极受大家的指正批评!
参考内容:
http://blog.csdn.net/jin3226390/article/details/3245519(cookie的操作详解)
http://www.cnblogs.com/kissdodog/archive/2013/01/21/2869298.html(MVC自定义过滤器)
- ASP.NET中cookie与Fiter实现简单登陆,AllowAnonymous匿名登陆
- ASP.NET使用Cookie简单实现记住登陆状态功能
- C#.net cookie、session实现自动登陆
- 在ASP.Net 中使用实现windows登陆的方法.
- asp.net 1.1/ 2.0 中快速实现单点登陆
- ASP.Net 中使用实现windows登陆的方法
- Microsoft ASP.NET MVC中Membership登陆的实现
- asp.net中实现登陆的时候用SSL
- Asp.net中实现同一用户名不能同时登陆(单点登陆)
- Asp.net中实现同一用户名不能同时登陆(单点登陆)
- Asp.net中实现同一用户名不能同时登陆(单点登陆)
- Asp.net中实现同一用户名不能同时登陆(单点登陆)
- Asp.net中实现同一用户名不能同时登陆(单点登陆)
- Asp.net中实现同一用户名不能同时登陆(单点登陆)
- Asp.net中实现同一用户名不能同时登陆(单点登陆)
- MVC + 三层 + ASP.NET 简单登陆验证
- cookie实现登陆
- Cookie实现自动登陆
- 解决OnsenUI单页面应用物理回退问题
- 多重继承
- java反射
- 【CodeForces】257C - View Angle(计算几何)
- selenium处理复选框radio
- ASP.NET中cookie与Fiter实现简单登陆,AllowAnonymous匿名登陆
- Android系统的录音功能MediaRecorder
- spring+springMVC+jQuery+Ajax+Mysql环境搭建实例
- React native for Android 初步实践[原理剖析]
- C/C++代码命名和格式规范
- js 实现 AOP
- Session 'app': Error Launching activity
- Android的消息机制
- Java中Vector和ArrayList的区别