我做了个项目,用户验证时用的SESSION,用户信息保存在SESSION里面,服务器运行一段时间后,在服务器负载大的时候,用户登录后用户信息经常丢失,后来我把用户验证改为了基于FORMS的验证后,基本上不会丢失用户信息了,我的软件框架设计为:
首先在Web.Config中将验证改为Forms,不允许匿名访问;
<authentication mode="Forms" >
<forms name=".MYOB_APP" loginUrl="loginout.aspx" protection="All" timeout="30" path="/" requireSSL="false" slidingExpiration="true" defaultUrl="default.aspx" cookieless="UseDeviceProfile" enableCrossAppRedirects="false" />
</authentication>
<authorization >
<deny users="?" />
</authorization>
登陆验证时查询数据库,如果用户有效则建立用户票证:用户附加数据格式用名称值格式,多个数据用“;”分开。
string userdata = "BranchID:1;RoleID:1";
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, username, DateTime.Now, DateTime.Now.AddMinutes(30), false, userdata, FormsAuthentication.FormsCookiePath);
string encTicket = FormsAuthentication.Encrypt(ticket);
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
在框架的页面基类里面将当前http请求中的将用户登录ID,和其他附加数据取出,再查询数据库,将当前用户的相关信息,以及相关需要缓存的数据取出,以备当前请求页逻辑使用。
FormsIdentity identity = (FormsIdentity)this.Page.User.Identity;
string userdata = identity.Ticket.UserData;
用户id就是 this.Page.User.Identity.Name
这样系统就完全不用SESSION验证了,如果用户没有登录或没有活动而超时系统自动将引导向loginout.aspx,在这个页面处理一些清理工作,再引导至登陆验证页面