FormsAuthentication.SignOut() 会删除所有登录凭证

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如下:



 
  

 
 
  
 

 
  
 

 
   
     
   

   
  
  
     name=".ASPXAUTHCBS"  path="/" cookieless="UseCookies" />
   

  
   
     
    
   

  

  
   
    
    
   

  

  
   
    
    
    
   

  

   
   

   
   
   
 

 
   
     
       
     

   

 

 
   
     
       
     

   

 

 
   
     
       
     

   

 

 
   
     
       
     

   

 

 
  
 

 
 
  
  
  
   
   
  

  
  
   
  

  
   
   
   
   
   
   
   
   
   
   
   
   
    
    

    

    
   
  
 

你可能感兴趣的:(asp.net,web,service)