前言
前段时间使用 ASP.NET MVC + Form Auth 做了一个单机小项目,当时对于采用什么方式来存储登录状态有些纠结,通常的做法是使用 Cookie 或者 Session,但是我对这两种方式都不是十分满意,于是花了点时间调研了 ASP.NET 的全局变量使用方式,希望能找到更好的方式来存储登录状态。
以下是本次调研过程及总结。
调研过程及总结
Application
测试过程:
- LoginController 在 Chrome 浏览器写入 Application[“Test”] 的值
- 在 Edge 浏览器打开,Application[“Test”] 的值依然存在
总结
Application 是全局性的,不太适合存储登录状态
Session
测试过程:
- LoginController 在 Chrome 浏览器写入 Session[“Test”] 的值
- 重新刷新 Chrome 浏览器页面,值存在
- 在 Edge 浏览器打开,Session[“Test”] 的值不存在
结论
Session 适合存储登录状态,其值存储在服务器端,重启 IIS 或者到时间(默认是20分钟)等方式都会使其丢失
Cookie
测试过程:
- LoginController 在 Chrome 浏览器写入 HttpCookie [“Test”] 的值
- 重新刷新 Chrome 浏览器,值存在
- 在 Edge 浏览器 打开,cookie 不存在
结论
Cookie 适合存储登录状态,其值存储在客户端,不能存储太多信息,安全性没有 Session 好
静态变量
测试过程:
- LoginController 在 Chrome 浏览器写入静态变量 GlobalTest.MyLogin 的值
- 在 Edge 浏览器打开,GlobalTest.MyLogin 的值依然存在
结论
静态变量是全局性的,不太适合存储登录状态
后记
权衡之下,最终还是选择使用 Session,在单机模式下,Session 相对比较安全可靠。当然还可以把登录状态持久化到本地文件或者数据库中,不过这又是另外一回事了,维护起来也相对比较麻烦。