2013-08-26 11 views
12

Moja aplikacja ma kontrolę nad uprawnieniami użytkownika, ponieważ nie wszyscy użytkownicy mogą uzyskać dostęp do pełnej witryny. W tej chwili wszystkie te uprawnienia dla określonego użytkownika są przechowywane w jego sesji, ponieważ byłoby to dla mnie problemem przeszukiwania bazy danych w każdym poście.ASP.NET Kill Session By Id

Problem polega na tym, że po usunięciu uprawnienia użytkownik nadal może uzyskać dostęp do strony i dopiero po zamknięciu przeglądarki aktualizacja staje się skuteczna.

Czy istnieje sposób na zabicie określonej sesji aplikacji według identyfikatora, zmuszając użytkownika do ponownego zalogowania się?

+1

Mimo że nie jest to dokładnie to, czego szukasz, jeśli często zmieniasz uprawnienia, możesz chcieć rzucić okiem na zmianę długości sesji za pomocą właściwości Page.Session.Timeout, ponieważ domyślnie jest to 20 minut. – user2366842

+0

Dostałem twój punkt, ale nie mogę tego zrobić. Uprawnienia nie są często zmieniane, ale potrzebuję, aby w momencie ich pojawienia się aktualizacja zaczęła działać w tym samym momencie, zmuszając użytkownika do ponownego zalogowania. Niestety, niektóre funkcje użytkownika zabierają mu zbyt dużo czasu. –

+0

Metoda Brute Force, jeśli używasz stanu w pamięci, to ponowne uruchomienie aplikacji po zmianach uprawnień ... Pamiętaj, że nie będzie działać z prawidłowym procesem poza procesem, takim jak SQL. –

Odpowiedz

13
"Is there a way to Kill an specific Application Session by the ID, forcing user to Log in again?" 

Nie. Można uzyskać dostęp do obiektu Session użytkownika wykonującego bieżące żądanie (tj. Siebie), a nie innych obiektów sesji użytkownika.

Musisz więc przechowywać identyfikator użytkownika w innym miejscu, na przykład w kolekcji statycznej. Gdy użytkownik wyśle ​​następne żądanie, możesz sprawdzić, czy identyfikator znajduje się w kolekcji i zaktualizować uprawnienia lub wylogować użytkownika.

Inną alternatywą byłoby zachowanie obiektów uprawnień wszystkich aktualnie zalogowanych użytkowników w zbiorze statycznym, jak również w ich zmiennych sesji. W ten sposób będziesz mógł zmienić obiekt uprawnień bez uzyskiwania dostępu do obiektu Session tego użytkownika.

Korzystanie ze zmiennych statycznych w aplikacji internetowej oczywiście wiąże się ze zwykłymi środkami ostrożności. Ponieważ wiele wątków może uzyskać do niego dostęp, dostęp musi być zsynchronizowany. Ponadto, jak zauważył Aleksiej Levenkov, jeśli masz wiele serwerów, musisz synchronizować dane między serwerami.

+0

Dzięki @Guffa. Wypróbuję Twoje rozwiązanie, ponieważ zdaję sobie sprawę, że nie mogę uzyskać dostępu do obiektu sesji innego użytkownika. –

+2

+1 na "nie innych użytkownikach obiektów sesji" ... Byłbym bardzo ostrożny przy "zbieraniu statycznym" dla uprawnień - jak każdy rodzaj pamięci podręcznej wymaga kodu, aby zachować synchronizację z faktycznym miejscem przechowywania/między maszynami (jeśli jest więcej niż on służy na stronie). Może być łatwiej połknąć wynik działania sprawdzania uprawnień, jeśli poprawność sprawdzania uprawnień jest ważna. –

+0

@AlexeiLevenkov: Dobra uwaga. Dodałem notatkę o ryzyku za pomocą zmiennych statycznych. – Guffa

1

Możesz napisać Session.Abandon(); lub Session.Clear();

lub Session.SessionID[int index];

sklepu szczególną wartość sesji użytkownika w to, a następnie użyj Session.Abandon(); i Session.Clear();

Za zabicie określonej sesji spróbować wykorzystać Session.Remove("key");

+3

To zabija całą sesję, a nie tylko jedną konkretną sztukę. –

+0

@KarlAnderson: - To prawda !! Zaktualizowałem również moją odpowiedź. Dzieki za sugestie!!!!:) –

+1

Prawdopodobnie nie ma takiego scenariusza OP - niewielu użytkowników wykona z chęcią "weź wszystkie pozwolenia ode mnie", wydaje się bardziej "odbierać uprawnienia od tego użytkownika" ... –

-2

Aby usunąć konkretny element Session, użyj Session.Remove(), np. jest:

Session.Remove("YourKey"); 

Uwaga: usuwa wartość i klucz z Session, podczas gdy można zobaczyć, że ludzie używają Session["YourKey"] = null; będzie usunąć tylko wartość, ale pozostawić klucz. To może, ale nie musi być to, co chcesz, ale chciał tylko zwrócić uwagę na rozróżnienie.