void m_view_lnbExit_Exit(object sender, EventArgs e)
{
FormsAuthentication.SignOut();
HttpContext.Current.Session.Abandon();
FormsAuthentication.RedirectToLoginPage();
}
使用上述方法会删除所有登录凭证
这样会现问题,两个用户登录,在一个客户端。一个退出了,另一个没有退出。另一个会被强行退出。
HttpContext.Current.Session.Abandon(); 会清除客户端相关所有session.
所以,另一用户的session也会被清除。
解决办法一,用Session验证,不用weform验证,每次在basePage基类里验证.这种办法有点老土,但可以做到多个用户在一个客户端同时登陆.登录时,session里放一个用于存储已登录用户列表,然后还要通过URL传给后续页当前登录用户信息,接收页面要记录当前操作是哪个用户在操作.哪个用户退出时,就从session中移出登录哪个用户数据.转到登录界面.基类验证时注意,捕获URL传来的用户信息,看用户信息是否在seeeion里的用户登录列表.如果不在,或没有传递参数就拒绝访问.
解决办法二,使用Cookie,使用Webform验证,但不使用 HttpContext.Current.User.Identity.Name,提取数据依据或做为判断当前用户,因为HttpContext.Current.User.Identity.Name里面记录的是最后一个用户登录的信息.不使用SignOut();退出,因为SignOut();是删除所有用户登录凭证.
登录时建立票据信息:
System.Web.Security.FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2, "userName", DateTime.Now, DateTime.Now.AddDays(3), true, string.Empty);
string cookieString = System.Web.Security.FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName);
cookie.Value = cookieString;
cookie.Expires = DateTime.Now.AddDays(3);
HttpContext.Current.Response.Cookies.Add(cookie);
然后重定向,指定页.
需要使用户获取ticket 用户信息
HttpCookie cookie = HttpContext.Current.Request.Cookies["userName"];
string userName = string.Empty;
if (cookie != null)
{
string cookieString = cookie.Value;
System.Web.Security.FormsAuthenticationTicket ticket = System.Web.Security.FormsAuthentication.Decrypt(cookieString);
}
退出时,删除相应的Cookie.HttpContext.Current.Response.Cookies.Remove("UserName");
如果通地址栏,直接进,可以进入(有待研究),就拿用户名名去查找cookie是否存在,如果不存在,就拒绝访问.
解决办法三,使用 webform 验证,可以使用HttpContext.Current.User.Identity.Name,使用SignOut();退出,但一个客户端只允许一个用户登录.不允许多个用户同时在一个客户端登录.允许同一用户或不同用户,在不同客户端同时登录.
登录:
string currentUser = HttpContext.Current.User.Identity.Name;
if (currentUser == string.Empty) //没用户在本客户端登录.
{
...//验证逻辑
FormsAuthentication.SetAuthCookie(m_view.UserName.ToString(), true);
}
else
{
m_view.Message = ""已经有用户登录,请先退出,再登录!"";
}
验证:这种方式就是不用担会从地址栏直接进入..net系统会自动拦截.
使用用户信息:HttpContext.Current.User.Identity.Name
退出:SignOut();
为防止用户直接关闭浏览器,而不点退出按钮,导至用户在此客户端无法再进入.
在页面如下代码
lnbOut是退出按钮id.
强制执行一次,退出.
webconfig如下: