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迁移,在迁移涉及获取用户登录信息的站点时,我们遇到 ...
随机推荐
- java8 学习系列--NIO学习笔记
近期有点时间,决定学习下java8相关的内容: 当然了不止java8中新增的功能点,整个JDK都需要自己研究的,不过这是个漫长的过程吧,以自己的惰性来看: 不过开发中不是有时候讲究模块化开发么,那么我 ...
- 点餐系统sprint3总结
转眼间,sprint3也结束了.意味着软件工程的课程结束了,我们的项目也完成了.在队友们的认真学习,专注打码,辛苦赶工后,我们的项目完成了.显然是仓促中完成的,没有完美的界面.没有无bug的项目,但是 ...
- 关于使用FusionCharts生成图表时出现invalid xml data错误提示的解决方法
FusionCharts的确功能是够强大的.收集的功能估计更强大.在初次使用时,对着手册,一步一步操作,就是生成图表工具不成功.一直报"Invalid xml data"错误.后面 ...
- [liusy.api-SMJ]-MAVEN archetype 创建项目
•选择或创建工作空间 Select a workspace –File – Switch Workspace - other
- Qt之添加QLabel的点击事件
QLabel功能为显示了一个字符串或者图片等信息,它本身没有click信号.也就不能够响应click点击事件,有什么办法来实现来,我们可以子类化QLabel,实现MouseXXXEvent.class ...
- Ado.net 数据库读取文件
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString; using ...
- SqlServer 一个查询语句以致tempdb增大55G (转载)
SqlServer 一个查询语句导致tempdb增大55G 今天操作着服务器,突然右下角提示“C盘空间不足”! 吓一跳!~ 看看C盘,还有7M!!!这么大的C盘空间怎么会没了呢?搞不好等下服务器会动不 ...
- 【ASP.NET 问题】IIS发布网站后出现 "处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误"的解决办法
新装IIS,然后发布网站,运行出现如下错误提示 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler” 于是 ...
- Android数字签名
描述你对Android数字签名的理解? 数字签名就是为程序打上一个标记来作为自己的标识,是Android系统要求的,若一个Android程序没有经过数字签名,没办法安装到系统: 签名也是对apk的一种 ...
- 搭建基于Jenkins salt-api的运维工具
1. 安装salt-master和salt-minion 安装过程不再赘述,请参考http://docs.saltstack.com/en/latest/topics/installation/ind ...