ASP.NET: sesja.Zmiany SessionID między żądaniami

Dlaczego właściwość SessionID na Session -object w ASP.NET-page zmienia się między żądaniami?

Mam taką stronę:

...
<div>
    SessionID: <%= SessionID %>
</div>
...

I wyjście zmienia się za każdym razem, gdy wciskam F5, niezależnie od przeglądarki.

Author: Seb Nilsson, 2010-05-20

12 answers

To jest powód

Podczas Korzystania ze stanu sesji opartego na plikach cookie, ASP.NET nie przydziela miejsca na dane sesji, dopóki nie zostanie użyty obiekt sesji. W rezultacie dla każdego żądania strony generowany jest nowy identyfikator sesji do momentu uzyskania dostępu do obiektu sesji. Jeśli aplikacja wymaga statycznego identyfikatora sesji dla całej sesji, możesz zaimplementować metodę Session_Start w aplikacji Global.ASAX plik i przechowywać dane w obiekcie sesji w celu ustalenia ID sesji, lub możesz użyć kodu w innej części aplikacji do jawnego przechowywania danych w obiekcie sesji.

Http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.sessionid.aspx

Więc zasadniczo, o ile nie uzyskasz dostępu do obiektu sesji w backendzie, nowy identyfikator sesji będzie generowany przy każdym żądaniu

EDIT

Ten kod musi być dodany do pliku Global.asax. Dodaje wpis do obiektu sesji, dzięki czemu naprawiasz sesji do jej wygaśnięcia.

protected void Session_Start(Object sender, EventArgs e) 
{
    Session["init"] = 0;
}
 193
Author: Claudio Redi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-11 15:09:41

Jest jeszcze inny, bardziej podstępny powód, dla którego może to nastąpić nawet wtedy, gdy obiekt sesji został zainicjowany, jak pokazało Cladudio.

W Sieci.config, jeśli istnieje wpis <httpCookies>, który jest ustawiony na requireSSL="true", ale w rzeczywistości nie używasz HTTPS: dla konkretnego żądania, wtedy plik cookie sesji nie jest wysyłany (lub może nie jest zwracany, nie jestem pewien, który), co oznacza, że kończysz z zupełnie nową sesją dla każdego żądania.

Znalazłem ten trudny sposób, spędzając kilka godziny przechodzące w tę i z powrotem między kilkoma commitami w mojej kontroli źródła, dopóki nie odkryłem, jaka konkretna zmiana zepsuła moją aplikację.

 81
Author: Neville Cook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-19 14:31:38

W moim przypadku zorientowałem się, że plik cookie sesji madomenę , która zawiera prefiks www., podczas gdy prosiłem o stronę Bez www..
Dodanie www. do adresu URL natychmiast naprawiło problem. Później zmieniłem domenę cookie na .mysite.com zamiast www.mysite.com.

 5
Author: Kniganapolke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-14 15:18:41

Using Neville ' s answer (deleting requiessl = true, in web.config) i lekko modyfikując kod Joela Ethertona, oto kod, który powinien obsługiwać witrynę, która działa zarówno w trybie SSL, jak i non SSL, w zależności od użytkownika i strony (wracam do kodu i nie testowałem go jeszcze NA SSL, ale spodziewam się, że powinien działać - będzie zbyt zajęty później, aby wrócić do tego, więc oto jest:

if (HttpContext.Current.Response.Cookies.Count > 0)
        {
            foreach (string s in HttpContext.Current.Response.Cookies.AllKeys)
            {
                if (s == FormsAuthentication.FormsCookieName || s.ToLower() == "asp.net_sessionid")
                {
                    HttpContext.Current.Response.Cookies[s].Secure = HttpContext.Current.Request.IsSecureConnection;
                }
            }
        }
 3
Author: Reid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-20 00:26:59

Mój problem polegał na tym, że mieliśmy ten zestaw w sieci.config

<httpCookies httpOnlyCookies="true" requireSSL="true" />

Oznacza to, że podczas debugowania w non-SSL (Domyślnie), plik cookie auth nie zostanie wysłany z powrotem do serwera. oznaczałoby to, że serwer wysyła nowy plik cookie auth (z nową sesją) dla każdego żądania z powrotem do klienta.

Poprawką jest ustawienie requiessl na false w web.config i true w sieci.uwolnij.config lub włącz SSL podczas debugowania:

włącz SSL

 2
Author: josh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-18 18:15:52

Inną możliwością, która powoduje, że SessionID zmienia się pomiędzy żądaniami, nawet gdy Session_OnStart jest zdefiniowany i / lub sesja została zainicjowana, jest to, że nazwa hosta URL zawiera nieprawidłowy znak (np. podkreślenie). Uważam, że jest to specyficzne dla IE( nie zweryfikowane), ale jeśli twój adres URL to, powiedzmy, http://server_name/app, IE zablokuje wszystkie pliki cookie, a informacje o sesji nie będą dostępne między żądaniami.

W rzeczywistości każde żądanie będzie zawierało osobną sesję na serwerze, więc jeśli Twoja strona zawiera wiele obrazów, znaczników skryptu itp., wtedy każde z tych żądań GET spowoduje inną sesję na serwerze.

Dalsze informacje: http://support.microsoft.com/kb/316112

 1
Author: R. Aaron Zupancic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-22 14:03:26

Mój problem był z aplikacją Microsoft MediaRoom IPTV. Okazuje się, że aplikacje MPF MRML nie obsługują plików cookie; zmiana na sesje cookieless w sieci.config rozwiązał mój problem

<sessionState cookieless="true"  />

Oto naprawdę stary artykuł o tym: Cookieless ASP.NET

 1
Author: denvercoder9,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-15 23:32:35

W moim przypadku działo się to często w moich środowiskach programistycznych i testowych. Po wypróbowaniu wszystkich powyższych rozwiązań bez powodzenia okazało się, że udało mi się rozwiązać ten problem, usuwając wszystkie pliki cookie sesji. Rozszerzenie Web developer sprawia, że jest to bardzo łatwe do zrobienia. Głównie używam Firefoksa do testowania i rozwoju, ale stało się to również podczas testowania w Chrome. Poprawka działała również w Chrome.

Jeszcze nie musiałem tego robić w środowisku produkcyjnym i nie otrzymałem zgłoszenia, że osoby nie mogą się zalogować. Wydawało się, że stało się to dopiero po tym, jak pliki cookie sesji były bezpieczne. Nigdy nie zdarzyło się to w przeszłości, kiedy nie byli bezpieczni.

 1
Author: Matt L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-16 16:17:24

W moim przypadku to dlatego, że modyfikowałem sesję po przekierowaniu z bramy w zewnętrznej aplikacji, więc ponieważ używałem IP zamiast na localhost w tym adresie URL strony, faktycznie uważano ją za inną stronę z różnymi sesjami.

In summary

Zwróć większą uwagę, jeśli debugujesz aplikację hostowaną na IIS zamiast IIS express i mieszasz swój komputer http://Ip i http://localhost w różnych strony

 1
Author: Iman Abidi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-06 07:28:06

Upewnij się, że nie masz limitu czasu sesji, który jest bardzo krótki, a także upewnij się, że jeśli używasz sesji opartych na plikach cookie, akceptujesz sesję.

FireFox webDeveloperToolbar jest pomocny w takich chwilach jak ten, ponieważ możesz zobaczyć pliki cookie ustawione dla Twojej aplikacji.

 0
Author: Mitchel Sellers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-20 13:27:10

Resetowanie identyfikatora sesji może mieć wiele przyczyn. Jednak wszelkie wymienione powyżej nie odnoszą się do mojego problemu. Opiszę to na przyszłość.

W moim przypadku nowa sesja utworzona na każde żądanie skutkowała nieskończoną pętlą przekierowań. Akcja przekierowania odbywa się w zdarzeniu OnActionExecuting.

Również wyczyściłem wszystkie nagłówki http (również w zdarzeniu OnActionExecuting Za Pomocą odpowiedzi .Metoda ClearHeaders) w celu zapobiegania buforowaniu stron na po stronie klienta. Ale ta metoda czyści wszystkie nagłówki, w tym informacje o sesji użytkownika, a co za tym idzie wszystkie dane w Temp storage (które używałem później w programie). Więc nawet ustawienie nowej sesji w zdarzeniu Session_Start nie pomogło.

Aby rozwiązać mój problem, upewniłem się, że nie usuwam nagłówków, gdy nastąpi przekierowanie.

Mam nadzieję, że to komuś pomoże.

 0
Author: user3253726,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-22 10:29:40

Wpadłem na ten problem w inny sposób. Kontrolery, które miały ten atrybut [SessionState(SessionStateBehavior.ReadOnly)] odczytywały z innej sesji, mimo że ustawiłem wartość w oryginalnej sesji po uruchomieniu aplikacji. Dodałem wartość sesji za pomocą _layout.cshtml (może nie najlepszy pomysł?)

To było wyraźnie ReadOnly powodujące problem, ponieważ kiedy usunąłem atrybut, oryginalna sesja (i SessionId) pozostanie w takcie. Dzięki rozwiązaniu Claudio / Microsoftu udało się to naprawić.

 0
Author: goku_da_master,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-01 18:14:50