Cookie mylenie z FormsAuthentication.Metoda SetAuthCookie ()

Jest więc wiele postów na temat StackOverflow, ale nadal nie byłem w stanie rozwiązać mojego dokładnego problemu. Oto sedno:

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

Moje pytanie Jest Takie: w sieci.plik konfiguracyjny, istnieje atrybut timeout do " / system.web/authentication/ forms" Jeśli ustawię tę wartość na powiedzmy, 30 minut, czy jest to czas nieaktywności użytkownika, który może mieć przed wygaśnięciem sesji?

Powodem, dla którego pytam jest to, że bez względu na to, na co ustawiam tę wartość, jeśli ustawię persistence na true w SetAuthCookie (), wygaśnięcie zestawu plików cookie wynosi 90 minut. Jeśli ustawię persistence na false w SetAuthCookie (), wygaśnięcie pliku cookie zostanie ustawione na "koniec sesji".

Co to jest wartość atrybutu" Timeout " i jak Mogę uzyskać trwały plik cookie, który trwa miesiąc, rok lub dłużej?

Author: LeftyX, 2011-02-09

1 answers

Parametr timeout, który znalazłeś w /system.web/authentication/forms, jest timeoutem (w minutach) czasu trwania paragonu uwierzytelniania.

Oznacza to, że po pewnym czasie nieaktywności użytkownik jest proszony o ponowne zalogowanie się. Jeśli spróbujesz sprawdzić to {[5] } będzie to false.

Możesz nie utrzymywać pliku cookie. W takiej sytuacji, jeśli twój bilet wygaśnie, Twój plik cookie również wygaśnie. Plik cookie (w przypadku, gdy jest przechowywany) ma na celu zapamiętanie użytkownika, jeśli wróci do twojego miejscu.

Możesz zachować plik cookie przez 10 lat, aby użytkownik nigdy nie musiał ponownie wpisywać nazwy użytkownika i hasła, chyba że zdecyduje się usunąć plik cookie. Plik cookie jest ważny nawet wtedy, gdy przeglądarka jest ZAMKNIĘTA(gdy jest utrzymywana).

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

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

Jeśli to prawda, Twój bilet uwierzytelniania będzie odnawiany za każdym razem, gdy pojawi się aktywność na twojej stronie: odśwież stronę itp.

What you można - I to co zrobiłem-napisać własne ciasteczko w ten sposób:

 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

Update

Zaimplementowałem tę rutynę, ponieważ chcę przechowywać moje 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ć ustawiłem wygaśnięcie pliku cookie uwierzytelniania i paragonu uwierzytelniania z tym samym limitem czasu (tylko wtedy, gdy został utrzymany).

Kolejną rzeczą, którą próbowałem, jest zapisanie nazwy użytkownika i hasła w zaszyfrowanym pliku cookie. Za każdym razem, gdy ładowana jest strona główna Sprawdzam.Profil.Aktualne.IsAuthenticated, aby sprawdzić, czy uwierzytelnienie jest nadal ważne. Jeśli nie odczytam ciasteczko ponownie, uzyskaj nazwę użytkownika i hasło i sprawdź je 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

Bezpieczeństwo.CookieAuth to obiekt, który stworzyłem, aby zwrócić nazwę użytkownika i hasło.
CookieUserData to magazyn (zapisuję w formacie json), w którym umieszczam hasło i grupy.

 46
Author: LeftyX,
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
2012-04-26 10:32:24