2011-02-08 21 views
37

W związku z tym istnieje wiele postów dotyczących StackOverflow, ale nadal nie udało mi się rozwiązać mojego problemu. Oto sedno:Dezorientacja plików cookie metodami FormsAuthentication.SetAuthCookie()

Mam stronę internetową, która wymaga uwierzytelnienia. Używam standardowej metody .NET FormsAuthentication.SetAuthCookie() do utrzymywania sesji użytkownika.

Moje pytanie jest następujące: W pliku web.config znajduje się atrybut timeout dla węzła "/system.web/authentication/forms". Jeśli ustawię tę wartość na 30 minut, czy jest to czas braku aktywności użytkownika, jaki może mieć użytkownik przed wygaśnięciem jego sesji?

Powód, dla którego pytam, to to, że bez względu na to, do czego ustawię tę wartość, jeśli ustawię persistent na wartość true w SetAuthCookie(), to wygaśnięcie w zestawie ciasteczek wynosi 90 minut. Jeśli ustawię persistence na wartość false w SetAuthCookie(), okres ważności pliku cookie jest ustawiony na "koniec sesji".

Co właściwie ustawia wartość atrybutu "Limit czasu" i jak uzyskać trwały plik cookie trwający miesiąc lub rok lub dłużej?

Odpowiedz

44

Limit czasu parametru znaleziony w /system.web/authentication/forms to limit czasu (w minutach) czasu trwania biletu uwierzytelniającego.

Oznacza to, że po pewnym czasie braku aktywności użytkownik jest monitowany o ponowne zalogowanie. Jeśli spróbujesz sprawdzić to My.Profile.Current.IsAuthenticated, będzie to false.

Możesz zdecydować, aby nie utrwalać pliku cookie. W takiej sytuacji, jeśli wygasa Twój bilet, wygasa również Twój plik cookie. Cookie (w przypadku jest trwałe) ma na celu zapamiętanie użytkownika, jeśli wróci do witryny.

Możesz chcieć przechowywać plik cookie przez 10 lat, aby użytkownik nie musiał już wstawiać nazwy użytkownika i hasła, chyba że zdecydował się usunąć plik cookie. Plik cookie jest ważny, nawet jeśli przeglądarka jest zamknięta (jeśli jest zachowana).

Kolejną ważną rzeczą do zapamiętania jest slidingExpiration parametr:

<authentication mode="Forms"> 
    <forms loginUrl="~/Partner/LogOn" defaultUrl="~/Home/Index" 
      timeout="30" slidingExpiration="true" /> 
</authentication> 

jeśli to prawda bilet uwierzytelniania zostanie odnowiony za każdym razem pojawia się aktywność na swojej stronie: odświeżenie strony itp

Co ty można zrobić - i to, co zrobiłem - jest napisać swój własny plik cookie takiego:

FormsAuthenticationTicket authTicket = new 
    FormsAuthenticationTicket(1, //version 
    userName, // user name 
    DateTime.Now,    //creation 
    DateTime.Now.AddMinutes(30), //Expiration (you can set it to 1 month 
    true, //Persistent 
    userData); // additional informations 

Aktualizacja

I zostały wdrożone to rutynowe bo chcesz zapisać swoje grupy w zaszyfrowanym pliku cookie:

Dim authTicket As System.Web.Security.FormsAuthenticationTicket = _ 
     New System.Web.Security.FormsAuthenticationTicket(_ 
      1, _ 
      UserName, _ 
      Now, _ 
      Now.AddYears(100), _ 
      createPersistentCookie, _ 
      UserData) 

Dim encryptedTicket As String = System.Web.Security.FormsAuthentication.Encrypt(authTicket) 

Dim authCookie As HttpCookie = New HttpCookie(_ 
    System.Web.Security.FormsAuthentication.FormsCookieName, _ 
    encryptedTicket) 

If (createPersistentCookie) Then 
    authCookie.Expires = authTicket.Expiration 
End If 

Response.Cookies.Add(authCookie) 

Jak widać mam ustawić wygasania cookie uwierzytelniania i autoryzacji z biletów ten sam limit czasu (tylko wtedy, gdy jest utrwalony).

Inną rzeczą, której próbowałem, to przechowywanie nazwy użytkownika i hasła w zaszyfrowanym pliku cookie. Za każdym razem, gdy ładowana jest strona wzorcowa, sprawdzam, czy funkcja My.Profile.Current.IsAuthenticated sprawdza, czy uwierzytelnianie jest nadal poprawne.Jeśli nie ja ponownie przeczytać cookie, uzyskać nazwę użytkownika i hasło, a następnie sprawdzić go na DB:

Public Function ReadCookieAuthentication(ByVal Context As System.Web.HttpContext) As Security.CookieAuth 

    Dim CookieUserData = New Security.CookieAuth() 

    Dim cookieName As String = System.Web.Security.FormsAuthentication.FormsCookieName 
    Dim authCookie As HttpCookie = Context.Request.Cookies(cookieName) 

    If (Not (authCookie Is Nothing)) Then 
     Dim authTicket As System.Web.Security.FormsAuthenticationTicket = Nothing 
     Try 
      authTicket = System.Web.Security.FormsAuthentication.Decrypt(authCookie.Value) 
      If (Not (authTicket Is Nothing)) Then 
       If (authTicket.UserData IsNot Nothing) AndAlso Not String.IsNullOrEmpty(authTicket.UserData) Then 
        CookieUserData = New JavaScriptSerializer().Deserialize(Of Security.CookieAuth)(authTicket.UserData.ToString) 
       End If 
       CookieUserData.UserName = authTicket.Name 
      End If 
     Catch ex As Exception 
      ' Do nothing. 
     End Try 
    End If 

    Return (CookieUserData) 

End Function 

Security.CookieAuth jest obiekt został utworzony, aby powrócić nazwę użytkownika i hasło.
CookieUserData to pamięć (zapisuję w formacie json), w której umieszczam moje hasło i grupy.

+1

Cześć, przepraszam, wiem, że to było zbyt stare, ale po prostu ciekawy, po co przechowywać go w formacie json? hasło i grupy. Jestem bardzo nowy w firmie mvc, więc nadal staram się zrozumieć koncepcje i najlepsze praktyki w jej opracowywaniu. dzięki! – gdubs

+3

@gdubs: Tak, wiem. To trochę niezwykłe. Mógłbym wybrać inny format, ale lubię JSON. Dodatkowo z MVC często używasz JSON, więc uznałem to za standard. – LeftyX

Powiązane problemy