问题描述
|
我的表单身份验证工作正常,有效期为3个月,cookie设置为:
FormsAuthentication.Initialize();
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,this.txtUsername.Text,DateTime.Now,DateTime.Now.AddMonths(3),true,string.Empty);
因此,即使重新启动了IIS或进行了项目重建,用户仍然可以通过身份验证,直到他选择注销我们过去的3个月为止。
至于自定义角色提供者[授权部分],当用户登录isValid()时,我添加了会话变量:
HttpContext.Current.Session.Add(\"userinfo\",userInfo);
但是据我们所知,会话在web.config更改,项目构建,IIS重新启动或默认情况下经过20分钟后会过期。
我想要做的就是使系统保存Session [\“ userinfo \”]与身份验证[cookie]相同,但是当然不用在cookie中设置userinfo,因为即使userId被认为是安全隐患,它也不安全。曲奇饼!
那么如何实现呢?我以为将用户ID存储在Cookie中,但已加密,然后如果我发现会话已过期,但用户仍通过身份验证,我会从数据库中重新加载userInfo,但这种方法是否足够好或可用?以及如何将userInfo存储在上述代码段的authTicked中的(string.Empty)中,以后可以访问并且如何使用它?
解决方法
好的,听起来没有人回应!所以我选择将userId存储在身份验证票证的用户数据部分中:
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,this.txtUsername.Text,DateTime.Now,DateTime.Now.AddMonths(3),true,UserInfo.UserId.ToString());
然后,当我需要检查userInfo时,请使用以下属性:
public UserInformation UserInfo
{
get
{
if (Session[\"userinfo\"] == null)
{
FormsIdentity id = (FormsIdentity)User.Identity;
FormsAuthenticationTicket ticket = id.Ticket;
long userId = Convert.ToInt64(ticket.UserData);
Session[\"userinfo\"]=new MySqlMembershipProvider().LoadUserInfo(userId);
}
return (UserInformation)Session[\"userinfo\"];
}
}
就这样。我想到了配置文件提供者,但我不喜欢从数据库[9个表结构]中获取用户权限,然后将它们重新存储在会话表中的记录下(就像在您自己周围循环),如果用户有权限或偏好,更新了更多的数据库命中所需!