zoukankan      html  css  js  c++  java
  • 采用Asp.Net的Forms身份验证时,持久Cookie的过期时间会自动扩展

    问题描述

    之前没有使用Forms身份验证时,如果在登陆过程中把持久的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属性根本不太重要,系统会在每次请求页面时重新判断过期时间,如果快过期了就自动扩展。

    注:上面引用的这段话有问题,对于持久Cookie才有过期时间的说法,非持久Cookie一般也称为会话Cookie,不能跨浏览器进程存在,所以关闭浏览器就消失了。

    亲自验证

    真正的学习和领会就需要亲自动手了,下面几个步骤会带领我们验证上面的说法(下面截图中使用的是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的写入和页面的跳转(第二个参数表明这是一个持久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过期时间的机制更是锦上添花,让我们有更多的时间关注于业务逻辑的实现

  • 相关阅读:
    理解OAuth 2.0
    Npoi导出word(Peanuts)
    轻松搞定javascript日期格式化问题
    史上最全的MSSQL复习笔记
    SQL经典短小代码收集
    Web系统与自控系统数据通讯架构 之 OPC DA DataChangeEventHandler 非热点数据更新策略 ,
    记一次SQL Server insert触发器操作
    记一次单机Nginx调优,效果立竿见影
    windows 显示引用账户已被锁定,且可能无法登录
    C# 使用modbus 读取PLC 寄存器地址
  • 原文地址:https://www.cnblogs.com/chenya/p/4306116.html
Copyright © 2011-2022 走看看