向服务器发送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匿名登陆的更多相关文章

  1. 【转载】Asp.Net中Cookie对象的作用以及常见属性

    Cookie对象是服务器为用户访问存储的特定信息,这些信息一般存储在浏览器中,服务器可以从提交的数据中获取到相应的Cookie信息,Cookie的最大用途在于服务器对用户身份的确认,即票据认证,用户会 ...

  2. ASP.NET中Cookie跨域的问题及解决代码

    ASP.NET中Cookie跨域的问题及解决代码 http://www.liyumei.net.cn/post/share18.html Cookies揭秘  http://www.cnblogs.c ...

  3. ASP.NET中Cookie的使用

    学习web开发,使用Cookie是不可避免的,在这就浅 显的总结一下,供新手参阅.个人感觉Cookie的使用和ASP.NET中的Session非常像,只不过Cookie是保存在客户端,而 Sessio ...

  4. asp.net中Cookie的用法【转】

    比如建立一个名为aspcn,值为灌水小鱼的cookie HttpCookie cookie = new HttpCookie["aspcn"];cookie.Value = &qu ...

  5. 关于asp.net中cookie在调试过程中读写正常发布后乱码问题

    最近在做的项目发布后出现了乱码的问题,既然出现了乱码很大的可能性是跟编码有关系,所以首先的解决方案就是重新对cookie进行编码, 在写入的cookie的时候编码,在读取的时候解码 在写入cookie ...

  6. Asp.Net中对操作Sql Server 简单处理的SqlDB类

    好久不接触这些闲暇时间回顾一下以前的基础.因为平常使用的时候都是直接调用SqlDB.dll这个类.先看这个类的结构 纸上得来终觉浅,绝知此事要躬行.个人觉得里面的标准操作就是对数据库增删查改 .特别适 ...

  7. Asp.Net MVC 5使用Identity之简单的注册和登陆

    由于.Net MVC 5登陆和注册方式有很多种,但是Identity方式去实现或许会更简单更容易理解 首先新建一个项目 其次如下选择Empty和MVC的选项 然后打开NuGet包管理器分别安装几个包 ...

  8. ASP.NET中登录功能的简单逻辑设计

     ASP.NET中登录功能的简单逻辑设计                               概述                               逻辑设计             ...

  9. .NET跨平台之旅:ASP.NET Core从传统ASP.NET的Cookie中读取用户登录信息

    在解决了asp.net core中访问memcached缓存的问题后,我们开始大踏步地向.net core进军——将更多站点向asp.net core迁移,在迁移涉及获取用户登录信息的站点时,我们遇到 ...

随机推荐

  1. Java提高篇——单例模式

    介绍 在我们日常的工作中经常需要在应用程序中保持一个唯一的实例,如:IO处理,数据库操作等,由于这些对象都要占用重要的系统资源,所以我们必须限制这些实例的创建或始终使用一个公用的实例,这就是我们今天要 ...

  2. NGINX、PHP-FPM开机自动启动

    NGINX SHELL脚本   放到/etc/init.d/下取名nginx #!/bin/sh # # nginx - this script starts and stops the nginx ...

  3. 灵活运用SQL Server SSIS变量

    在SSIS开发ETL(Extract-Transform-Load),数据抽取.转换.装载的过程.我们需要自己定义变量 一.SSIS变量简介 SSIS(SQL Server Integration S ...

  4. MVC中权限管理

    权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少.权限管理几乎出现在任何系统里面,只要有用户和密码的系统.权限管理还是比较复杂的,有的固定到某个模 ...

  5. getPhysicalNumberOfCells 与 getLastCellNum的区别

    用org.apache.poi的包做excel导入,无意间发明若是excel文件中有空列,空列后面的数据全部读不到. 查来查去本来是HSSFRow供给两个办法:getPhysicalNumberOfC ...

  6. java布局学习 (二)

    前文中介绍了FlowLayout和BorderLayout 本文我们将会继续介绍java中的布局方式 (3)GridLayout 网格布局 这种布局会将整个容器划分成M行*N列的网格. 如下图:    ...

  7. Android 短信广播接收相关问题

    本人是Android新手,最近做了一个关于监听手机短信功能的应用,我在网上看资料了解到广播分为有序广播和无序广播,有序广播:无序广播又称普通广播,其中的利弊我也一时没搞清楚,我用的是有序广播实现的,具 ...

  8. php 读取json数据文本所遇到的问题

    json数据属于特殊的字符串,一般自己写的json数据不要误加空格,回车,换行, 若是从其他文件读取过来的json数据很有可能带有空格,回车,换行等符号,导致使用json_decode()转诚数组失败 ...

  9. html与css面试结合工作的总结难点

    面试的时候一般会常常问起的,同时也是工作的时候会常常问道的几个问题,一下之列表内容,详细的后会附有文章,希望能帮到大家,同时有不足希望大家多多补充交流. 1.主要是的是浮动的问题(常见的问题有,三列布 ...

  10. Create a SQL Server Database on a network shared drive

    (原文地址:http://blogs.msdn.com/b/varund/archive/2010/09/02/create-a-sql-server-database-on-a-network-sh ...