对于ASPNET Forms验证想必大家都非常的熟悉然而在控制用户的(过期时间)expired time的时候你是否遇到过一些奇怪的现象呢?虽说只是一个小小的cookie但是其中可能有很多的东西你都不知道今天我将和大家详细讨论一下cookie的注意点
在ASPNET 的Forms验证中通常我们会使用ASPNET自带的Login控件来进行验证同时在nfig文件中我们所有的Forms设置都设为默认现在问题就来了
) 为什么我明明点了Remember me而大概半个小时后我又Log out了?
) 为什么我明明设置了timeout为无限期 eg 为什么一两天之后我又Log out了呢?
这是Forms验证中遇到的比较多的问题下面我就这两个问题做一个详细的解释对于问题一首先我要阐明ticket和cookie的区别cookie是一个容器用来存放东西它是保存在客户端的而ticket是具体的数据用来表示具体的验证信息它是放在cookie这个容器中的因而在我们验证的过程中以下事情发生了首先ticket被创造了里面包含着用户名等信息同时它有一个过期时间然后cookie被创造了它同样也有一个过期时间最后将ticket保存在cookie中并将此cookie发送到client的浏览器中读到这里我想问题已经很明白了用户的Log out就是因为时间过期的问题但具体是谁的时间过期了呢?在我们ASPNET nfig的设置中timeout是cookie的过期时间(注意默认是分钟)而ticket的过期时间是无限的因为我们选了Remember me这就是为什么虽然我点了Remember me但在分钟左右后我仍然被Log out了因为我们并没有设置cookie的timeoutticket和cookie只要其中之一不是永远不过期我们都无法实现永不过期
当我们解决了问题一后(假如手动设置timeout=)我们又遇到了问题二这又是什么原因呢?这得从ticket的加密解密机制说起ASPNET会使用一个machinekey来对cookie进行加密这个machinekey默认是在application启动时随机生成的然后ASPNET会使用同一个machinekey进行cookie进行解密正式因为这个key是application启动时随机生成的才导致了问题二试想如果application recycle(重启)了怎么办?ASPNET会生成另一个key进行解密以前的cookie将不再有效这就是问题二的原因了知道了这个解决第二个问题的办法就很简单了手动设置一个特定的key
如Code <machineKey validationKey=CBCACFCFBBCFBBFCFCADEBE decryptionKey=BACFC validation=SHA />
PS 网上也有些随机生成key的站点如/tools/keycreatoraspx看到这里大家是不是对Forms验证cookie有新的了解呢 )