ASP.NET中cookie与Fiter实现简单登陆,AllowAnonymous匿名登陆
向服务器发送cookie
在登陆的时候,我们可以可以通过下列代码,向服务器发送cookie,其中包括自己的账号信息(不涉及加密),用以后面判断访问者.
HttpCookie cookie = new HttpCookie("userinfo");//新建一个名为userinfo的cookie
cookie.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,这个问题引刃而解.
首先我们自定义一个过滤器
public class CheckLogin : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("userinfo");//获取当前请求的所有cookie中名为userinfo的cookie if (cookie==null||cookie.Values["UserName"] == null || cookie.Values["PassWord"] == null)//判断账号密码信息
{
filterContext.Result = new RedirectResult("/Account/Login");//若帐号密码为null或者cookie不存在,即返回登录页面
}
}
}
}
这个过滤器放在控制器或者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.HttpApplication
2 {
3 protected void Application_Start()
4 {
5 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
6 }
7 }
8 }
匿名访问
按照上述代码进行登陆操作,你会发现,根本找不到登录页面,原因在于,上述全局作用的过滤器,连登录页面都没有放过,就是说,你连进入登陆页面都还需要验证信息,没有信息你就返回登录页,可是登陆页你也无法访问.最后就报错.
所以对于某些特定的页面,我们需要能够匿名访问,这也是一个很实际问题,很多网页我们不需要登陆可以很轻松的访问.
对于匿名访问我们需要用到: [AllowAnonymous],能够跳过验证,实现匿名访问.
public class CheckLogin : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var actionFilters = filterContext.ActionDescriptor.GetCustomAttributes(false);//获取所有的描述符 foreach (var item in actionFilters)
{
if (item.GetType().Name == "AllowAnonymousAttribute")//如果描述符类型中有AllowAnonymousAttribute(AllowAnonymous类型的名字),就直接访问,不需要验证
{
return;
}
}
HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("userinfo");//获取当前请求的所有cookie中名为userinfo的cookie if (cookie==null||cookie.Values["UserName"] == null || cookie.Values["PassWord"] == null)//判断账号密码信息
{
filterContext.Result = new RedirectResult("/Account/Login");//若帐号密码为null或者cookie不存在,即返回登录页面
}
}
}
这样,我们就可以实现匿名登录,不需要验证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对象的作用以及常见属性
Cookie对象是服务器为用户访问存储的特定信息,这些信息一般存储在浏览器中,服务器可以从提交的数据中获取到相应的Cookie信息,Cookie的最大用途在于服务器对用户身份的确认,即票据认证,用户会 ...
- ASP.NET中Cookie跨域的问题及解决代码
ASP.NET中Cookie跨域的问题及解决代码 http://www.liyumei.net.cn/post/share18.html Cookies揭秘 http://www.cnblogs.c ...
- ASP.NET中Cookie的使用
学习web开发,使用Cookie是不可避免的,在这就浅 显的总结一下,供新手参阅.个人感觉Cookie的使用和ASP.NET中的Session非常像,只不过Cookie是保存在客户端,而 Sessio ...
- asp.net中Cookie的用法【转】
比如建立一个名为aspcn,值为灌水小鱼的cookie HttpCookie cookie = new HttpCookie["aspcn"];cookie.Value = &qu ...
- 关于asp.net中cookie在调试过程中读写正常发布后乱码问题
最近在做的项目发布后出现了乱码的问题,既然出现了乱码很大的可能性是跟编码有关系,所以首先的解决方案就是重新对cookie进行编码, 在写入的cookie的时候编码,在读取的时候解码 在写入cookie ...
- Asp.Net中对操作Sql Server 简单处理的SqlDB类
好久不接触这些闲暇时间回顾一下以前的基础.因为平常使用的时候都是直接调用SqlDB.dll这个类.先看这个类的结构 纸上得来终觉浅,绝知此事要躬行.个人觉得里面的标准操作就是对数据库增删查改 .特别适 ...
- Asp.Net MVC 5使用Identity之简单的注册和登陆
由于.Net MVC 5登陆和注册方式有很多种,但是Identity方式去实现或许会更简单更容易理解 首先新建一个项目 其次如下选择Empty和MVC的选项 然后打开NuGet包管理器分别安装几个包 ...
- ASP.NET中登录功能的简单逻辑设计
ASP.NET中登录功能的简单逻辑设计 概述 逻辑设计 ...
- .NET跨平台之旅:ASP.NET Core从传统ASP.NET的Cookie中读取用户登录信息
在解决了asp.net core中访问memcached缓存的问题后,我们开始大踏步地向.net core进军——将更多站点向asp.net core迁移,在迁移涉及获取用户登录信息的站点时,我们遇到 ...
随机推荐
- java实现删除文件以及文件夹
首先,需要明确的是File类中的delete()方法适用于删除空目录,或者单个文件. 然后,对于二级目录以上的文件夹的删除,需要分两步进行删除. 1.删除最底层目录下面的文件,或者空目录 当有多个文件 ...
- SpringMVC操作指南-整合Spring、SpringMVC、Hibernate、JUnit、Log4j、C3P0
- [Struts2] Action Implements SessionAware
struts2 的Action中若希望访问Session对象,可采用两种方式: 1.从ActionContext中获取: 2.实现SessionAware接口. 1.从ActionContext中获取 ...
- Canvas: Out of system resources
一个手写板的项目 在线程中操作Canvas画用户的笔记, 画不了几笔就卡住不画了, 然后保存到另外的image时 提示“Out of system Resource”错误, 百思不得姐 中间考虑是不是 ...
- windows下jenkins常见问题填坑
没有什么高深的东西,1 2天的时间大多数人都能自己摸索出来,这里将自己遇到过的问题分享出来避免其他同学再一次挖坑. 目录 1. 主从节点 2. Nuget自动包还原 3. powershell部署 4 ...
- NoSQL数据库笔谈(转)
NoSQL数据库笔谈 databases , appdir , node , paper颜开 , v0.2 , 2010.2 序 思想篇 CAP 最终一致性 变体 BASE 其他 I/O的五分钟法则 ...
- 数据流 in redux
之前用学过的react和react-router写了个单页面应用,但写完后总感觉还欠缺点什么,怎么说呢,就是感觉在数据流的控制上被框架约束的厉害,很不自由,比如兄弟组件间的通信就很不方便.然后才了解到 ...
- jquery 提交From表单
/** * 异步提交From */ function ajaxSubmitFrom (btnId,fromId,url){ $(btnId).click(function () { var optio ...
- 最常用的截取函数有left,right,substring
最常用的截取函数有left,right,substring 1.LEFT ( character_expression , integer_expression ) 返回从字符串左边开始指定个数的字符 ...
- angularJS和jQuery的区别
问题: 假如我熟悉利用jQuery去开发客户端应用,那么我怎么上手angularjs,能否描述下所需要的模式转变,下面这些问题能够帮助你给出一个回答: 1.在设计客户端web应用的时候有什么区别,最大 ...