2012-01-26 15 views
6

Czy istnieje sposób sprawdzenia, czy identyfikator sesji jest poprawny w kontekście istniejącego żądania? W tym przypadku, jeśli otrzymam identyfikator sesji, a ja jestem aktualnie w innej sesji zainicjowanej przez żądanie HTTP i jestem na stronie lub w jakiejś klasie, czy mogę zweryfikować ten identyfikator sesji, jeśli jest prawidłowy i obecnie istnieje i nie został porzucony?W ASP.Net, Czy mogę dowiedzieć się, czy inna sesja istnieje lub jest ważna przez identyfikator sesji?

Powodem tego jest, że musimy zablokować proces logowania użytkownika na stronie projektu, nad którym pracuję, aby każdy użytkownik mógł być zalogowany tylko raz. Myślałem o tym, aby dodać kolumnę identyfikatora sesji do tabeli użytkownika, jeśli jest ona pusta, wylogowuje się i jest ustawiana po zalogowaniu się i wyczyszczeniu po wylogowaniu lub po Session_End w pliku global.asax. Jeśli jednak z jakiegoś powodu sesja zostanie przerwana bez jej usunięcia, muszę mieć możliwość ponownego zalogowania się, w takim przypadku za każdym razem, gdy się logują i odnajduje identyfikator sesji w tej kolumnie, myślę, że powinno to w jakiś sposób sprawdzić, czy to ID sesji jest aktywna i ważna, jeśli nie, to będzie ją przywrócić do ich nowego Session ID i pozwolić im się zalogować.

Dzięki

+0

Czy musisz utrzymywać sesję na zawsze? Oznacza to, że ASP .NET ostatecznie zrezygnuje z wygasłych sesji. Ale z punktu widzenia użytkownika, czy stan aplikacji zawsze powinien pozostać taki sam? – Yuck

+0

Nie mamy, mamy 30-minutowy, przesuwny czas, który będzie wymagał od użytkownika, aby się zalogować. Nie używamy żadnego uwierzytelniania opartego na plikach cookie, tylko aktywna sesja i przechowywanie obiektu użytkownika w nim. Po przekroczeniu limitu czasu sesje są "wylogowane" i muszą się ponownie zalogować. –

Odpowiedz

0

nie ma bezpośredniego sposobu sprawdzania sessionid. Opcje:

  • Możesz zaimplementować własnego dostawcę stanu sesji (lub może menedżer tożsamości będzie wystarczający), aby ujawnić dostęp do tych informacji (http://msdn.microsoft.com/en-us/library/aa479024.aspx).
  • Po prostu spróbuj oszukać, ustawiając plik cookie z identyfikatorem sesji na podstawie identyfikatora, który Twoim zdaniem powinien mieć bieżący użytkownik i ponownie renderuj stronę. Jedno drugie żądanie będzie w stanie sprawdzić, czy ten identyfikator odpowiada poprawnemu stanowi i, jeśli to konieczne, ponownie się zalogować.

Uwaga: W tym celu nie użyłbym identyfikatora sesji, ponieważ będziesz polegać na szczegółach implementacji. Być może po prostu odrzuci sesje, które nie wyglądają jak najnowsze dla tego użytkownika. Posiadanie właściwości "moja obecna nazwa sesji" zapisanej w Session["someName"] iw DB użytkownika powinno wystarczyć do odrzucenia renderowania starszych sesji.

2

Musisz przechowywać sesje w bazie danych, aby znaleźć wcześniej.
Zobacz więcej HOW TO: Configure SQL Server to Store ASP.NET Session State

+0

Powyższy komentarz ma zły angielski, ale właściwy pomysł. Jeśli używałeś serwera SQL dla swojego stanu sesji, uważam, że przechowuje on identyfikator sesji jako kolumnę. Możesz to po prostu sprawdzić. – Rocklan

1

Jedynym sposobem mogę myśleć to zrobić jak mówi Neperz i zapisywać sesje w bazie danych przy użyciu dostawcy SQLServer sesji, dzięki czemu można następnie użyć kwerendy SQL, aby zobaczyć, co jest dostępne.

Są jednak pewne zastrzeżenia do rozważenia:

  1. wierzę identyfikator sesji przechowywane w tabeli bazy danych sesja nie jest dokładnie taki sam jak identyfikator sesji można uzyskać dostęp z kodem. Nie pamiętam dokładnie, gdzie to czytałem, ale myślę, że doświadczyłem tego problemu, gdy robiłem coś podobnego do monitorowania wszystkich aktywnych sesji.
  2. Zdarzenie globalne Session_End nigdy nie zostanie uruchomione, jeśli używany jest dostawca sesji SQLServer.
  3. Jeśli nie użyjesz jawnie kodu Session.Abandon() w celu zakończenia sesji (np. Gdy użytkownik się wyloguje), twoje sesje mogą się zawiesić, dopóki zadanie agenta SQL nie wyczyści żadnych wygasłych sesji. Oznacza to, że jeśli ktoś zamknął okno przeglądarki, ich sesja nadal byłaby "aktywna", co może skomplikować implementację.
1

Inną opcją masz/miał :-) byłoby użyć WeakReferences:

  • Dictionary<youruseridtype,WeakReference> jest przechowywany na poziomie aplikacji jako aplikacja [ "mySessionDictionnary"]
  • na rozpoczęcie sesji, przechowuj userid i WeakReference do samego obiektu Session w Dictionnary
  • , gdy użytkownik chce się zalogować, sprawdza się w Dictionnary dla swojego identyfikatora. Jeśli obiekt Session ma niepoprawną wartość WeakReference, można go Abandon() ten istniejący obiekt Session, zapewniając, że nie ma więcej niż jednej aktywnej sesji na użytkownika.

The WeakReference zapewnia, że ​​nie ucierpi pamięć.

Uwaga: działałoby to tylko w przypadku zarządzania sesją inProc. Ponieważ Dictionnary nie przetrwa restartu aplikacji, powinno być takie samo dla sesji.

Mam nadzieję, że już znalazłeś właściwą odpowiedź na swój problem ;-)

Powiązane problemy