2012-01-26 1 views
6

세션 ID가 기존 요청 컨텍스트 내에서 유효한지 알아낼 방법이 있습니까? 이 세션 ID를 부여 받았고 현재 HTTP 요청에 의해 시작된 다른 세션에 있고 페이지 또는 일부 클래스에있는 경우 유효하고 현재 존재하는 경우 해당 세션 ID의 유효성을 검사 할 수 있습니까? 버려진 적이 없습니까?ASP.Net에서 다른 세션이 있는지 또는 세션 ID에 의해 유효한지 알 수 있습니까?

그 이유는 내가 작업하고있는 프로젝트의 페이지에서 사용자 로그인 프로세스를 잠그면 모든 사용자가 한 번만 로그인 할 수 있기 때문입니다. 이것에 대한 내 생각은 사용자 테이블에 세션 ID 열을 추가하는 것이 었습니다. null 인 경우 로그 아웃되며, 로그 아웃하거나 global.asax의 Session_End에서 로그 아웃 할 때 설정됩니다. 그러나 어떤 이유로 세션을 지우지 않고 포기한 경우, 다시 로그인 할 수 있어야하며,이 경우 로그인 할 때마다 해당 열의 세션 ID를 찾을 때마다 어떻게 든해야한다고 생각합니다. 그렇지 않으면, 그것은 그들의 새로운 세션 ID로 재설정하고 로그인 할 수 있습니다, 그 세션 ID가 활성화하고 유효한지 확인하십시오.

감사

+0

세션을 영원히 유지해야합니까? 결국 ASP .NET은 만료 된 세션을 포기하게됩니다. 그러나 사용자 관점에서 애플리케이션 상태는 항상 동일하게 유지되어야합니다. – Yuck

+0

우리는 사용자가 다시 로그인해야하는 슬라이딩 30 분 제한 시간이 있습니다. 우리는 쿠키 기반 인증, 활성 세션 및 사용자 개체 저장에 익숙하지 않습니다. 세션이 시간 초과되면 "로그 아웃"되어 다시 로그인해야합니다. –

답변

0

을 세션 ID를 검증하는 직접적인 방법이 없습니다. 옵션 :

  • 당신은 정보 (http://msdn.microsoft.com/en-us/library/aa479024.aspx)에 대한 액세스를 노출 자신의 세션 상태 제공자 (또는 어쩌면 ID 관리자 충분하다)를 구현할 수 있습니다.
  • 현재 사용자가 가지고 있다고 생각하는 ID를 기반으로 세션 ID 쿠키를 설정하고 페이지를 다시 렌더링하기 만하면됩니다. 1 초 요청은 해당 ID가 유효한 상태인지 확인하고 필요할 경우 다시 로그인 할 수 있습니다.

참고 : 구현 세부 정보를 사용하므로 세션 ID를 사용하지 않습니다. 이 사용자에 대해 최신 것처럼 보이지 않는 세션을 거부하는 것이 효과가있을 수 있습니다. Session["someName"] 및 사용자 DB에 저장된 "현재 세션 이름"속성을 사용하면 이전 세션 렌더링을 거부 할 수 있습니다.

2

이전에 찾으려면 데이터베이스에 세션을 저장해야합니다.
HOW TO: Configure SQL Server to Store ASP.NET Session State

+0

위의 의견은 영어가 좋지 않지만 올바른 생각입니다. 세션 상태에 대해 SQL Server를 사용했다면 세션 ID를 열로 저장한다고 생각합니다. 그걸 확인할 수있을거야. – Rocklan

1

에 내가 생각할 수있는 유일한 방법은 Neperz 말한대로 수행하고 다음 가능한 것이 무엇인지 알아보기 위해 SQL 쿼리를 사용할 수 있습니다 의미하는 SQLServer 세션 공급자를 사용하여 데이터베이스에 세션을 저장하는 것입니다 참조하십시오.

은 그러나 몇 가지주의 사항이 고려가 :

  1. 나는 세션 데이터베이스 테이블에 저장된 세션 ID가 정확히 당신이 코드에서 액세스 할 수있는 세션 ID와 동일하지 않습니다 믿습니다. 내가 읽은 곳을 정확하게 기억할 수는 없지만 모든 활성 세션을 모니터링하기 위해 비슷한 일을하고있을 때이 문제가 발생했다고 생각합니다.
  2. 세션 공급자를 사용하는 경우 전역 Session_End 이벤트가 실행되지 않습니다.
  3. 명시 적으로 코드에서 Session.Abandon()을 사용하여 세션을 종료하지 않으면 (예 : 사용자가 로그 아웃 할 때) SQL 에이전트 작업이 만료 된 세션을 정리할 때까지 세션이 중단 될 수 있습니다. 즉, 누군가가 브라우저 창을 닫은 후에도 세션이 여전히 "활성"으로 표시되어 구현이 복잡해질 수 있습니다.
1

당신이 가지고있는 또 다른 옵션/:-)있는 WeakReferences 사용하는 것입니다했다 :

  • Dictionary<youruseridtype,WeakReference> 당신은 세션 시작시 응용 프로그램 [ "mySessionDictionnary"]
  • 와 같은 응용 프로그램 수준에서 저장됩니다 Dictionnary
  • 사용자가 로그인하려고 할 때 세션 객체 자체에 WeakReference 및 WeakReference를 저장하면 자신의 ID에 대한 Dictionnary를 체크인합니다. Session 객체에 비어 있지 않은 WeakReference가있는 경우 사용자별로 하나 이상의 활성 세션이 없도록이 기존 Session 객체를 Abandon() 할 수 있습니다.

WeakReference는 메모리 누수가 발생하지 않도록합니다.

NB : 이것은 inProc 세션 관리에서만 작동합니다. Dictionnary는 응용 프로그램을 다시 시작할 때 생존 할 수 없으므로 세션에서 동일해야합니다.

귀하의 문제에 대한 올바른 답변을 이미 찾으 셨기를 바랍니다.

관련 문제