问题描述

之前没有使用Forms身份验证时,如果在登陆过程中把HttpOnly的Cookie过期时间设为半个小时,总会收到很多用户的抱怨,说登陆一会就过期了。

所以总是会把Cookie过期时间设的长一些,比如两个小时甚至一天,这样就能保证在登陆时设置一次Cookie,用户可以操作很长时间也不过期。

虽然也可以在每次用户请求页面时检查Cookie的过期时间并自动扩展,但未免过于麻烦,不如一次设大点来的简单。

偶然发现

今天在使用Forms身份验证编写《AppBox-基于ExtAspNet的企业通用管理框架》时,想当然的在Web.config中这么设置:

<authentication mode="Forms">
      <forms name=".ASPXFORMSAUTH" loginUrl="~/default.aspx" timeout="360" defaultUrl="~/main.aspx" protection="All" path="/"/>
</authentication>

我把过期时间设为了6个小时,以期望在登陆后的 6 个小时内不会听到用户的抱怨。
由于希望把用户所属的角色也一并保存到User.Identity中,在查阅关于自定义的身份验证时无意发现这篇文章中的一段话:

若不是持久Cookie,Cookie的有效期Expiration属性有当前时间加上web.config中timeout的时间,每次请求页面时,在验证身份过程中,会判断是否过了有效期的一半,要是的话更新一次cookie的有效期

太棒了!如果真是这样,所谓的timeout属性根本不太重要,系统会在每次请求页面时重新判断过期时间,如果快过期了就自动扩展。

亲自验证

真正的学习和领会就需要亲自动手了,下面几个步骤会带领我们验证上面的说法(下面截图中使用的是FireFox + FireBug + FireCookie)。

1. 配置Web.config

<authentication mode="Forms">
      <forms name=".ASPXFORMSAUTH" loginUrl="~/default.aspx" timeout="2" defaultUrl="~/main.aspx" protection="All" path="/"/>
</authentication>

我们把过期时间设为 2 分钟,以方便观察Cookie的过期时间。

2. 登陆代码

在登陆成功的代码中,通过下面语句代码完成Cookie的写入和页面的跳转:

FormsAuthentication.RedirectFromLoginPage(userName, true);

3. 观察登陆后的Cookie信息

由于我们是在 2012-6-22 9:04:12 登陆的,所以这里的过期时间是 2012-6-22 9:06:12

4. 在登陆 1 分钟内刷新页面

一分钟内刷新页面,Cookie的过期时间没有变化,和上图一样。

5. 在登陆 1 分钟后刷新页面

在 9:05:13 刷新的页面,也就是刚刚过去 1 分钟,系统会自动扩展Cookie过期时间,在此基础上再增加 2 分钟,所以现在的过期时间是 9:07:13

6. 在登陆 2 分钟后刷新页面

两分钟后刷新,Cookie过期,页面会自动跳转到登陆页面。

 

总结

Asp.Net的Forms身份验证不仅为我们提供了一致和安全的验证手段, 而且这种自动扩展Cookie过期时间的机制更是锦上添花,让我们有更多的时间关注于业务逻辑的实现。

采用Asp.Net的Forms身份验证时,非持久Cookie的过期时间会自动扩展的更多相关文章

  1. 采用Asp.Net的Forms身份验证时,持久Cookie的过期时间会自动扩展

    原文:http://www.cnblogs.com/sanshi/archive/2012/06/22/2558476.html 若是持久Cookie,Cookie的有效期Expiration属性有当 ...

  2. asp.net的forms身份验证 单用户身份验证

    asp.net的forms身份验证  单用户身份验证 首先要配置Web.config文件 <system.web> <authentication mode="Forms& ...

  3. ASP.NET:Forms身份验证和基于Role的权限验证

    从Membership到SimpleMembership再到ASP.NET Identity,ASP.NET每一次更换身份验证的组件,都让我更失望.Membership的唯一作用就是你可以参考它的实现 ...

  4. 关于ASP.NET的“Forms身份验证”

    目录结构如图如示: 如果用户没有通过身份验证则跳转到登录页面让用户登录,在配置文件的<system.web></system.web>结点下添加如下代码: <!--身份验 ...

  5. IE11,用Forms身份验证保存不了Cookie

    在web.config中添加如下信息,即可. <authentication mode="Forms">      <forms cookieless=" ...

  6. ASP.NET Forms 身份验证

    ASP.NET Forms 身份验证 在开发过程中,我们需要做的事情包括: 1. 在 web.config 中设置 Forms 身份验证相关参数.2. 创建登录页. 登录页中的操作包括: 1. 验证用 ...

  7. asp.net Forms身份验证详解

    在做网站的时候,都会用到用户登录的功能.对于一些敏感的资源,我们只希望被授权的用户才能够访问,这让然需要用户的身份验证.对于初学者,通常将用户登录信息存放在Session中,笔者在刚接触到asp.ne ...

  8. asp.net Forms身份验证

    Web.config中的配置<system.web><authentication mode="Forms"> <forms name="K ...

  9. asp.net用户身份验证时读不到用户信息的问题 您的登录尝试不成功。请重试。 Login控件

    原文:asp.net用户身份验证时读不到用户信息的问题 您的登录尝试不成功.请重试. Login控件 现象1.asp.net使用自定义sql server身份验证数据库,在A机器新增用户A,可以登录成 ...

随机推荐

  1. SpringMVC注解@initbinder解决类型转换问题

    在使用SpringMVC的时候,经常会遇到表单中的日期字符串和JavaBean的Date类型的转换,而SpringMVC默认不支持这个格式的转换,所以需要手动配置,自定义数据的绑定才能解决这个问题.在 ...

  2. iOS 开发者必不可少的 75 个工具,你都会了吗

    如果你去到一位熟练的木匠的工作室,你总是能发现他/她有一堆工具来完成不同的任务. 软件开发同样如此.你可以从软件开发者如何使用工具中看出他水准如何.有经验的开发者精于使用工具.对你目前所使用的工具不断 ...

  3. ubuntu 安装AMP环境的笔记 Prefork方式与fast-cgi方法

    具体步骤如下: 系统:ubuntu 8.04 的发行版本 AMP with Prefork(mod-php5)       一.安装APACHE2 # sudo  apt-get  install   ...

  4. invalid initialization of non-const reference of type与discards qualifiers

    参数传递          函数参数的传递是初始化语义:用调用者的实参去初始化函数的形参,如果参数是对象,需要调用该类的拷贝构造函数,如果没有显式定义的拷贝构造函数,则执行默认的按成员拷贝      ...

  5. vmware 连网

    Nat 这 种方式下,虚拟机的网卡连接到宿主的 VMnet8 上.此时系统的 VMWare NAT Service 服务就充当了路由器的作用,负责将虚拟机发到 VMnet8 的包进行地址转换之后发到实 ...

  6. 【Linux】一个简单的线程创建和同步的例子

    最近很多精力在Linux上,今天简单看了一下Linux上的线程和同步,其实不管windows还是Linux,OS层面的很多原理和概念都是相同的,很多windows之上的经验和概念完全可以移植到Linu ...

  7. oracle 查看表的相关信息

    1.查看当前用户的表 SELECT * FROM user_tables; 2.查看指定用户的表 SELECT * FROM all_tables WHERE owner = 'SYS';

  8. Mac OS 10.8 中的 OpenCV 开发环境设置

    一.编译OpenCV 要在Mac OS上使用OpenCV,需要自己编译源代码.操作过程如下: 1)从http://www.cmake.org下载cmake 2.8安装包. 2)安装cmake 2.8. ...

  9. 【LeetCode】198 - House Robber

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  10. ASP.NET下跨应用共享Session和使用Redis进行Session托管简介

    在之前的博客中,我说到了Session的共享问题,其中说到了Web Farm和Web Garden两种情况下Session的处理.在ASP.NET提供的Session处理方法中,有以下四种模式: 1. ...