2011-01-02 18 views
7

Mam stronę Asp Mvc 2 przy użyciu uwierzytelniania formularzy. Kiedy uruchomię go lokalnie, mogę się zalogować i pozostać zalogowany przez czas nieokreślony.Dlaczego moi użytkownicy mogą być wylogowani po upływie minuty?

Jednak po umieszczeniu go na serwerze wydaje mi się, że pozostaje on zalogowany przez kilka minut, a następnie wydaje się być wylogowany. Sprawdziłem ciasteczka i są 2, które wydają się istotne:

.ASPXAUTH, który jest plikiem cookie sesji .ASPXANONYMOUS, który wygasa za 3 miesiące.

Kiedy odświeżam stronę, ciasteczka pozostają takie same, dopóki nie wyloguję się, kiedy wydaje mi się, że otrzymałem nowy plik .ASPXANONYMOUS, ale .ASPXAUTH wydaje się być taki sam.

Wygląda na to, że mogę pozostać zalogowany, dopóki nie zrobię czegoś po pewnym czasie. Jeśli prześlę formularz, gdy tylko się zaloguję, to działa poprawnie, ale jeśli będę ciągle przesyłać dane raz po raz, to po upływie minuty, jedno z zgłoszeń stanie się wylogowanym użytkownikiem, a nie użytkownikiem, który był zalogowany, a wszystkie pozostałe dokumenty pracowały jako.

Co może powodować takie zachowanie i jak mogę je zmienić, aby zmienić to ustawienie, aby móc pozostać zalogowany przez czas nieokreślony?

EDIT,

jego pojedynczy serwer, ale po pewnym więcej badań i poszukiwania prawdopodobnego kandydata wydaje się, że używam więcej niż 100 MB na serwerze, a pula aplikacji jest uzyskiwanie recyklingowi. Przypuszczam, że teraz muszę wiedzieć,

  • Jak mogę sprawdzić, ile pamięci używam.
  • Jakiej rady można to zredukować.
+0

z jakiego serwera hostujesz? jakiego dostawcy sesji używasz? – mlibby

+0

Czy masz tylko jeden serwer lub farmę serwerów równoważącą obciążenie? –

+0

@clcl, Nie mówię wyraźnie o dostawcy sesji, o którym nie myślę, więc używałbym domyślnego, cokolwiek to jest? Przepraszam, nie mogę być bardziej konkretny, ale to wszystko jest dla mnie trochę nowe. –

Odpowiedz

8

Czy to możliwe, że aplikacja ASP.NET jest ponownie uruchamiana lub wyłączana (np. Z powodu limitu czasu bezczynności lub nowo utworzonych/zmienionych zespołów)?

Po uruchomieniu aplikacji internetowej ASP.NET domyślnie generuje klucze szyfrowania do przeglądania plików cookie stanu i sesji. Spowoduje to unieważnienie wszelkich danych pierwotnie dostarczonych z wcześniejszego uruchomienia aplikacji (lub z innego systemu).

Aby sesje przetrwały w ASP.Cykle NET aplikacji (i gospodarstw multi-server) można określić klucze w web.config:

<system.web> 
    ... 
    <machineKey 
    decryption="AES" 
    validation="SHA1" 
    decryptionKey="..." 
    validationKey="..." 
    /> 

gdzie decryptionKey i validationKey są sześciokątne ciągi o długości w zależności od algorytmu (z AES: 64 cyfr i SHA1: 128, dla innych algorytmów sprawdź MSDN).

klucze te powinny być generowane kryptograficznie i NET typów, aby to zrobić, które mogą być używane z PowerShellu:

$rng = New-Object "System.Security.Cryptography.RNGCryptoServiceProvider" 
$bytes = [Array]::CreateInstance([byte], 16) 
$rng.GetBytes($bytes) 
$bytes | ForEach-Object -begin { $s = "" } -process { $s = $s + ("{0:X2}" -f $_) } -end { $s} 

AES użyciu powyższej długości tablicy, na SHA1 użyć długość 64.

+0

Dzięki! Wydaje się, że udało się to, przynajmniej nie zostałem wylogowany w ciągu ostatnich kilku minut, nawet jeśli wczytanie stron zajęło trochę czasu (co jest prawdopodobne, gdy nastąpił recykling). –

+0

to pomoże przetrwać klucze sesji , dobrze? Ale jeśli umieścisz jakieś rzeczywiste dane w sesji, musisz upewnić się, że używasz dostawcy sesji z nietrwałym utrwalaniem, takim jak SQL lub pliki, prawda? – mlibby

+1

@clcl: Prawidłowe. W stanie procesu proces umiera z procesem. Koniec procesu, a to oznacza, że ​​SQL Server przetrwa restart komputera. Wolę jednak założyć, że stan sesji jest przejściowy, a wszystko, co jest potrzebne, musi znajdować się w trwałym repozytorium z sesją jako pamięcią podręczną. – Richard

1

Jest całkiem prawdopodobne, że Limit czasu sesji na serwerze sieciowym jest skonfigurowany na znacznie mniejszy czas, niż ustawiono w konfiguracji uwierzytelniania formularza w pliku web.config.

Domyślny limit czasu sesji wynosi 20 minut dla IIS6 i IIS7.

Jeżeli masz dostęp do panelu administratora serwera sieci Web, można podnieść limit czasu poprzez GUI, ale można również ustawić w pliku konfiguracyjnym, jeśli IIS7 używając <sessionState> i <sessionPageState> sekcje:

http://msdn.microsoft.com/en-us/library/cc725820(v=ws.10).aspx

1

Sprawdź sekcja uwierzytelnianie webconfig

<authentication mode="Forms"> 
    <forms name="UniqueName" loginUrl="login.aspx" path="/" > 
    </forms> 
</authentication> 

Upewnij się, że nazwa pliku cookie uwierzytelniania dla każdej obsługiwanej miejscu jest wyjątkowy.

0

Jeśli żadna z tych opcji nie działa, sprawdź pule aplikacji i upewnij się, że limit czasu bezczynności jest ustawiony na ponad 20 minut. Kliknij pulę aplikacji, wybierz link Advanced Settings po prawej stronie, znajdź sekcję Process Model i zwiększ wartość Idle Timeout.

Powiązane problemy