讨论一下.NET里,对cookie身份验证的超时的处理
引言
在.NET里提供了FormsAuthentication类用来对用户身份进行验证和授权。不过,对于cookie的超时处理,一直是一个头疼的问题。这里介绍一下微软对.NET 身份验证超时的处理机制,不过我相信,这个机制并不是.NET所独有的,在你用任何语言(例如Java,Php,JS)等都会遇到这个问题,只是很多时候,我们不太在意这个问题。
问题的提出
我们通常使用cookie存放一下用户身份的信息,当然这些信息是加密的,然后输出到客户端,当用户提交时,在从cookie里获取这些信息,然后解密。其中很重要的一步是判断cookie有没有超时。考虑下面一种情况:一个用户与: 2020.3.9 10:00:00 登录一个系统,假设cookie的有效期为1个小时,也就是说 cookie将于 2020.3.9 11:00:00 失效。所以,服务器只要根据这个时间判断cookie是否失效即可,但是这个方式没有考虑时区。
例如:你的服务器是在“日本”,一个中国用户和一个美国用户访问该网站,登录后,服务器往这2个用户电脑上输出cookie,但是中美时区的不同,导致同一时刻,这2个用户看到的cookie日期出现了不同。因此,为了简化计划,在微软的.NET里,统一使用UTC时间,也就是世界标准时间。
在微软.NET的源代码里,给出了很大的注释来介绍这个问题。

参考上面注释,就算使用UTC时间,仍然还有一些问题。
简单解释一下上图代码里的注释:为了方便.NET对时间处理,.NET时间统一采用UTC世界标准时,这样,一个北京用户 2020.3.9 10:00:00 登录系统,因为在+8区,所以,会在标准时的基础上加上+8,另外一个用户会在标准时的基础上-8,大致是这样的意思。
但是,不是每个开发者,每种开发语言都会采用类似这样的策略,.NET还需要考虑扩展性,因此,时间大致分文三种:
1.DateTime是UTC时间,这种最简单,直接处理。
2.DateTime是本地时间,.NET Framework会把他转换为UTC时间,同时,DateTime类在设计时预留了一个隐藏字段,他可以处理自定义时间(下述)。
3.DateTime的类型未知,考虑和早期.NET1.1兼容性,就把他归类为本地时间。
自定义夏令时
自定义时区曾经在中国使用过。正式的名称叫做“北京夏令时”,中国在1986年-1991年间实施的一种夏季时间制度,北京夏令时比标准的北京时间早一个小时。
夏令时,主要解决“感官”问题,例如:冬天的北京,晚上19:00 新闻联播时,天已经黑了,而夏天的北京,19:00天还亮,为了让夏天的北京19:00天也变黑,那时间往后退一个小时。
同样的还有美国时间,PDT是指太平洋夏季时间,PST是指太平洋标准时间。
从地缘政治上说,中国采用的是统一+8区,看地图都知道,中国地域广,全国使用同一时间可能并不是合理,
因为如果规定全国都是早上8点上班,可能东部的山东青岛已经天大亮,而西藏的日喀则可能还是深夜。同样,晚上8点东部天黑了,而西部天还是下午。
但是,北京夏令时的人为拨动时间,确实会打乱生成,因此在1991年停止使用。
但是在有些国家还是使用的,为此,DateTime类在设计时,包含了一个隐藏字段,来自定义夏令时。通过DateTimeOffset 属性校对时间。
绝对到期与顺滑到期
cookie过期的第二个问题是绝对过期与顺滑过期。如上 用户与 2020.3.9 10:00:00 登录系统,2020.3.9 11:00:00 cookie到期,这种记录方法被成为“绝对时间”,简单但是粗暴。试想一个用户在写一篇问题,他在
2020.3.9 11:00:01提交时,系统突然提示,身份过期,然后跳转到登录页面,所写的内容全部丢失,估计用户会欲哭无泪。(当然现在都有ajax在暗地里验证,不会出现这种问题了)。
在.NET里给出了一个 SlidingExpiration 属性,他会让cookie过期进行动态延长。默认值为true,
什么意思呢?下面是MSDN的解释: 如果发出了请求并且超过了一半的超时时间间隔,则滑动过期会重置有效身份验证 cookie 的过期时间。 如果 cookie 过期,用户必须重新进行身份验证。
也就是,虽然你的cookie会于2020.3.9 11:00:00 过期,但是.NET系统会自动给你延长。

在代码实现方面,如果查看.NET源代码,可以看到系统提供了 RenewTicketIfOld 方法,然后把这个方法注入到 OnAuthenticate事件,来事件动态延长。
https://referencesource.microsoft.com/#System.Web/Security/FormsAuthentication.cs,629

整个实现算法还是比较复杂的。需要考虑的细节太多。例如有些浏览器禁止使用cookie等情况。当然,这些复杂情况微软都被我们做了,我们直接用即可。
讨论一下.NET里,对cookie身份验证的超时的处理的更多相关文章
- asp.net core中使用cookie身份验证
配置 在 Startup.ConfigureServices 方法中,创建具有 AddAuthentication 和 AddCookie 方法的身份验证中间件服务: services.AddAuth ...
- 简单服务器端Blazor Cookie身份验证的演示
为了演示身份验证如何在服务器端 Blazor 应用程序中工作,我们将把身份验证简化为最基本的元素. 我们将简单地设置一个 cookie,然后读取应用程序中的 cookie. 应用程序身份验证 大多数商 ...
- ASP.NET MVC Cookie 身份验证
1 创建一个ASP.NET MVC 项目 添加一个 AccountController 类. public class AccountController : Controller { [HttpGe ...
- 使用 cookie 的身份验证和授权
前言 在上一章 学学 dotnet core 中的身份验证和授权-1-概念 中,我们大致明白了身份验证和授权两者的关系.那么在本文中,我们将使用 cookie 来做一个简单的身份验证和授权. 本文中我 ...
- asp.net core 3.x 身份验证-1涉及到的概念
前言 从本篇开始将围绕asp.net core身份验证写个小系列,希望你看完本系列后,脑子里对asp.net core的身份验证原理有个大致印象.至于身份验证是啥?与授权有啥联系?就不介绍了,太啰嗦. ...
- asp.net core 3.x 身份验证-3cookie身份验证原理
概述 上两篇(asp.net core 3.x 身份验证-1涉及到的概念.asp.net core 3.x 身份验证-2启动阶段的配置)介绍了身份验证相关概念以及启动阶段的配置,本篇以cookie身份 ...
- 从零搭建一个IdentityServer——聊聊Asp.net core中的身份验证与授权
OpenIDConnect是一个身份验证服务,而Oauth2.0是一个授权框架,在前面几篇文章里通过IdentityServer4实现了基于Oauth2.0的客户端证书(Client_Credenti ...
- SQL Server安全(2/11):身份验证(Authentication)
在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Se ...
- asp.net 解决IE11下 From身份验证失效问题
指定如何将 Cookie 用于 Web 应用程序. <forms cookieless="UseCookies" name="test" loginUrl ...
随机推荐
- vue实现动态绑定class--(boolean)绑定class,点击有,再点击取消
<template> <div :class="{'flag':selected}" @click=clickBtn>xxx</div>< ...
- Redhat6更改yum源 (转)
最近虚拟机中安装了redhat6.3企业版,自带的yum用不起来,软件都找不到. 网上搜了一下说是没付钱...,需要改下yum源.操作步骤如下: 1.切换到yum源存放目录[root@rhel6 ~] ...
- IntelliJ IDEA项目断开版本管理解决方案
今天使用idea时打开项目突然发现项目不受svn管理(项目目录依然受svn管理,只是idea脱管了),如遇到可用以下方法: 图片示例: 1. 2. 希望能帮到你
- Introduction to Differential Equations,Michael E.Taylor,Page 3,4 注记
此文是对 [Introduction to Differential Equations,Michael E.Taylor] 第3页的一个注记.在该页中,作者给了微分方程$$\frac{dx}{dt} ...
- Tricks of Android's GUI
Tricks of Android's GUI */--> Tricks of Android's GUI 1 layoutweight In LinearLayout, the default ...
- linux awk详解
awk: awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑, awk在其对数据分析并生成报告时,显得尤为强大. 简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开 ...
- crm项目-stark组件
############### admin基本认识和常用的定制功能 ############### stark组件 对admin的基本认识 1,就是一个app,嵌入到了django里面,你可以 ...
- 实例理解scala 隐式转换(隐式值,隐式方法,隐式类)
作用 简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型.话不多说,直接测试 ImplicitHel ...
- 牛客-Highway
题目传送门 sol:看了题意显然是最大生成树,但是任意两个点之间都有边,大概有n*n条边.用朴素的最小生成树算法显然不行.联想了一下树的直径还是不会.看了大佬的题解,懂了... 所以还是直接贴大佬博客 ...
- MIO、EMIO、AXI_GPIO区别与联系
https://blog.csdn.net/u014485485/article/details/78141594 点灯实验