문제

여러 사람이 동일한 로그인을 사용하지 않도록 로그인 할 때 동일한 사용자 이름에 대한 기존 세션을 죽일 수 있기를 원합니다.

기존 세션을 통해 반복하고 죽일 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

이것을 Global.asax에 추가하십시오

protected void Application_Start(object sender, EventArgs e)
{
    Application["sessions"] = new List<HttpSessionState>();
}

protected void Session_Start(object sender, EventArgs e)
{
    var sessions = (List<HttpSessionState>)Application["sessions"];
    sessions.Add(this.Session);
}

protected void Session_End(object sender, EventArgs e)
{
    var sessions = (List<HttpSessionState>)Application["sessions"];
    sessions.Remove(this.Session);
}

이제 이와 같은 세션을 반복 할 수 있습니다

var sessions = (List<HttpSessionState>)Application["sessions"];

foreach (var session in sessions)
       ...

다른 세션을 죽이기 위해 당신은 Session_Start 오래된 세션을위한 방법을 포기하십시오. 이런 식으로 보일 수 있습니다.

protected void Session_Start(object sender, EventArgs e)
{
    var userId = (int)this.Session["userId"];
    foreach (var session in sessions)
        if ((int)session["userId"] == userId)
           session.Abandon();

    var sessions = (List<HttpSessionState>)Application["sessions"];
    sessions.Add(this.Session);
}

다른 팁

로그인 한 사용자를 데이터베이스에 저장하고 이미 로그인했는지 확인할 수 있습니다. 다시 로그인하지 못하게 할 수 있습니다. Global.asax에서 Session_start 메소드 사용

짧은 대답 : 아니요.

긴 대답 : 자신의 세션 제공 업체를 구현해야합니다. 보안상의 이유로 한 세션이 다른 세션을 참조 할 방법은 없습니다. 당신은 돌아 다니며 자신의 세션 관리를 구현해야합니다.

이것을 구현했을 때, 나는 응용 프로그램 변수, 사전 또는 배열에 사용자 ID (또는 고유 한 것)를 저장했습니다. 로그인시 애플리케이션 사전에 사용자 ID의 존재를 쉽게 확인할 수 있습니다. 유일한 문제는 로그 아웃하지 않고 브라우저를 닫는 사람들입니다. 이 이벤트를 감지 할 수있는 신뢰할 수있는 방법을 찾지 못할 것입니다.

커프에서 :

Session_Start (일반적으로 성공적인 로그인)에서 사용자의 userID를 저장하고 SessionID를 조회 테이블 (또는 사용자 테이블의 새 열)에 저장합니다.

각 요청에서 userID (세션에 저장) 및 SessionID가 조회 테이블에 저장된 값과 인증 단계로 일치하는지 확인해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top