Asp.net에서 같은 사용자 이름을 실현하면 동시에 로그인할 수 없습니다 (단일 로그인)

최근에 단일 로그인을 찾았는데 이 글을 발견했는데 실현 가능한 것 같아서 먼저 저장했습니다.
웹 프로젝트에서 자주 발생하는 문제는 바로 같은 사용자 이름이 여러 번 로그인하는 문제이다. 그에 상응하는 해결 방법도 매우 많은데 총괄적으로 보면 다음과 같은 몇 가지 해결 방법에 불과하다.
로그인한 사용자 이름을 데이터베이스 테이블에 넣기;
로그인한 사용자 이름을 세션에 넣기;
로그인한 사용자 이름을 Application에 넣기;
로그인한 사용자 이름은 Cache에 저장됩니다.
일반적인 이 몇 가지 방법은 로그인한 후에 정상적으로 종료하지 않으면 두 번째 로그인은 허용되지 않는다.이렇게 하면 일반적으로 문제가 존재한다. 만약에 사용자가 시스템을 정상적으로 종료하지 않았다면 그가 다음에 계속 로그인할 때 세션이 만료되지 않았기 때문에 시스템에 계속 로그인하는 것이 거부되고 세션이 만료된 후에만 로그인할 수 있다.본고에서 소개한 방법은 MSN 로그인과 유사한 방법으로 두 번째 로그인할 때 첫 번째 로그인을 취소합니다. 첫 번째 로그인은 MSN 팝업과 유사합니다. 귀하의 계정은 이미 다른 곳에서 로그인되었고 귀하는 오프라인 알림 정보를 강요받았습니다.
기능 구현도 간단합니다.
로그인 사용자 이름 암호 확인 통과 후 다음 코드를 입력합니다.
Hashtable hOnline = (Hashtable)Application["Online"];
if(hOnline != null) 
{ 
IDictionaryEnumerator idE = hOnline.GetEnumerator();
string strKey = ""; 
while(idE.MoveNext()) 
{ 
if(idE.Value != null && idE.Value.ToString().Equals(UserID))
{ 
//already login 
strKey = idE.Key.ToString(); 
hOnline[strKey] = "XXXXXX"; 
break; 
} 
} 
} 
else 
{ 
hOnline = new Hashtable(); 
} 
hOnline[Session.SessionID] = UserID; 
Application.Lock(); 
Application["Online"] = hOnline; 
Application.UnLock(); 

사용자가 로그인할 때 로그인 사용자 이름을 전역 변수 온라인에 두십시오. 온라인은 Hashtable 구조이고 Key는 Session ID이며 Value는 사용자 이름입니다.매번 사용자가 로그인할 때마다 아래 로그인할 사용자 이름이 온라인에 이미 존재하는지 판단합니다. 이 사용자 이름이 이미 로그인되어 있으면 첫 번째 로그인한SessionID에 대응하는 사용자 이름을 XXXXX로 강제로 변경하여 로그인이 강제로 취소됨을 의미합니다.
시스템의 모든 페이지가 CommonPage 페이지를 상속하는 CommonPage 페이지를 만들고 CommonPage 페이지의 백그라운드 코드에 다음 코드를 추가합니다.
override protected void OnInit(EventArgs e)
{ 
Hashtable hOnline = (Hashtable)Application["Online"];
if(hOnline != null) 
{ 
IDictionaryEnumerator idE = hOnline.GetEnumerator();
while(idE.MoveNext()) 
{ 
if(idE.Key != null && idE.Key.ToString().Equals(Session.SessionID))
{ 
//already login 
if(idE.Value != null && "XXXXXX".Equals(idE.Value.ToString()))
{ 
hOnline.Remove(Session.SessionID); 
Application.Lock(); 
Application["Online"] = hOnline; 
Application.UnLock(); 
MessageBox("          ,      !",Login.aspx);
return false; 
} 
break; 
} 
} 
} 
} 

CommonPage에 계승된 페이지는 새로 고칠 때 다시 불러오는 OnInit의 코드를 실행하고 온라인을 꺼내서 해당 사용자에 대응하는 SessionID를 찾아 SessionID에 대응하는 사용자 이름이 바뀌었는지 판단하고 변경하면 오프라인을 강요하고 Session을 지우고 Login 화면으로 이동한다.
마지막으로 Session이 만료되거나 시스템을 종료할 때 Global에서 자원을 방출해야 합니다.asax 파일의 SessionEnd에 다음 코드가 추가됩니다.
Hashtable hOnline = (Hashtable)Application["Online"];
if(hOnline[Session.SessionID] != null)
{ 
hOnline.Remove(Session.SessionID); 
Application.Lock(); 
Application["Online"] = hOnline; 
Application.UnLock(); 
} 

사용자가 정상적으로 종료하지 않은 후에 다시 로그인하면, 다시 로그인하는 우선 순위가 높기 때문에 사용자의 로그인에 영향을 주지 않으며, 정상적으로 종료하지 않은 사용자가 차지하는 자원은 세션이 만료된 후에 자동으로 지워지고 시스템의 성능에 영향을 주지 않습니다. 
 
Google은 WEB 시스템의 보안을 위해 SSO(Single Sign On Internation) 기능을 필요로 하는 경우에 작은 수정을 수행했습니다.
1) 암호 확인 후:
   Hashtable hOnline = (Hashtable)Application["Online"]; 
                     if (hOnline != null) 
                     { 
                      int i = 0; 
                       while (i<hOnline.Count) //  BUG       ,      
                         { 
                         IDictionaryEnumerator idE = hOnline.GetEnumerator(); 
                         string strKey = ""; 
                         while (idE.MoveNext()) 
                         { 
                             if (idE.Value != null && idE.Value.ToString().Equals(this.username.Text))
                             { 
                                 //already login             
                                 strKey = idE.Key.ToString(); 
                                 hOnline[strKey] = "XXXXXX"; 
                                 break; 
                             } 
                         } 
                         i = i + 1;
                         } 
                     } 
                     else 
                     { 
                         hOnline = new Hashtable(); 
                     } 
                     hOnline[Session.SessionID] = this.username.Text; 
                     Application.Lock(); 
                     Application["Online"] = hOnline; 
                     Application.UnLock(); 
                     //                     Online,Online Hashtable  , 
                     //Key SessionID,Value    。                    Online        ,
                     //             ,        SessionID           XXXXXX,           

2) 시스템의 모든 페이지가 CommonPage 페이지에서 상속되는 CommonPage 페이지를 만듭니다(
public partial class index: CommonPage) CommonPage 페이지의 백그라운드 코드에 다음 코드를 추가합니다.
using System; 
using System.Data; 
using System.Configuration; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
using System.Collections;
/// <summary> 
/// CommonPage          
/// </summary> 
public class CommonPage: System.Web.UI.Page 
{ 
     public CommonPage() 
{ 
   // 
   // TODO:             
   // 
} 
   override protected void OnInit(EventArgs e) 
     { 
         Hashtable hOnline = (Hashtable)Application["Online"]; 
         if (hOnline != null) 
         { 
             IDictionaryEnumerator idE = hOnline.GetEnumerator(); 
             while (idE.MoveNext()) 
             { 
                 if (idE.Key != null && idE.Key.ToString().Equals(Session.SessionID))
                 { 
                     //already login 
                     if (idE.Value != null && "XXXXXX".Equals(idE.Value.ToString()))
                     { 
                         hOnline.Remove(Session.SessionID); 
                         Application.Lock(); 
                         Application["Online"] = hOnline; 
                         Application.UnLock(); 
                        string js = "<script language=javascript>alert('{0}');window.location.replace('{1}')</script>";
                         Response.Write(string.Format(js, "         ,       (           )!", "logout.aspx?cname=noadmin"));

                         return; 
                     } 
                     break; 
                 } 
             } 
         } 
     } 
} 

CommonPage에 계승된 페이지는 새로 고칠 때 다시 불러오는 OnInit의 코드를 실행하고 온라인을 꺼내서 해당 사용자에 대응하는 SessionID를 찾아 SessionID에 대응하는 사용자 이름이 바뀌었는지 판단하고 변경하면 오프라인을 강요하고 Session을 지우고 Login 화면으로 이동한다.
3) 마지막으로 Session이 만료되거나 시스템을 종료할 때 자원을 Global에서 방출해야 한다.asax 파일의 SessionEnd에 다음 코드가 추가됩니다.
Hashtable hOnline = (Hashtable)Application["Online"]; 
   if(hOnline[Session.SessionID] != null) 
   { 
     hOnline.Remove(Session.SessionID); 
     Application.Lock(); 
     Application["Online"] = hOnline; 
     Application.UnLock(); 
   }  

좋은 웹페이지 즐겨찾기