Confusione dei cookie con il metodo FormsAuthentication.SetAuthCookie ()

Quindi ci sono molti post su StackOverflow a riguardo, ma non sono ancora riuscito a risolvere il mio problema esatto. Ecco il succo:

Ho un sito web che richiede l’autenticazione. Sto usando il metodo standard .NET FormsAuthentication.SetAuthCookie() per mantenere la sessione dell’utente.

La mia domanda è questa: nel file web.config, c’è un attributo di timeout nel nodo “/system.web/authentication/forms”. Se imposto questo valore per dire, 30 minuti, è questo il tempo di inattività dell’utente che l’utente può avere prima della scadenza della sessione?

Il motivo per cui lo chiedo è che, indipendentemente da cosa imposto questo valore, se imposto la persistenza su true in SetAuthCookie (), la scadenza sul set di cookie è di 90 minuti. Se imposto la persistenza su false in SetAuthCookie (), la scadenza del cookie è impostata su “end of session”.

Che cos’è il valore dell’attributo “Timeout” che si sta effettivamente impostando e come posso ottenere un cookie persistente che dura un mese o un anno o più?

Il timeout del parametro che hai trovato in /system.web/authentication/forms è il timeout (in minuti) della durata del ticket di autenticazione.

Ciò significa che dopo un certo periodo di inattività, all’utente viene richiesto di accedere nuovamente. Se provi a controllare questo My.Profile.Current.IsAuthenticated sarà false .

Puoi scegliere di non persistere il cookie. In questa situazione, se il tuo biglietto scade, anche il tuo cookie scade. Il cookie (nel caso sia persistente) ha lo scopo di ricordare all’utente se ritorna al tuo sito.

Potresti voler mantenere i cookie per 10 anni in modo che l’utente non debba mai inserire nuovamente nome utente e password, a meno che non abbiano scelto di eliminare il cookie. Il cookie è valido anche se il browser è chiuso (quando è persistente).

Un’altra cosa importante da ricordare è il parametro slidingExpiration:

    

se è vero, il tuo ticket di autenticazione verrà rinnovato ogni volta che ci sarà attività sul tuo sito: aggiornamento della pagina ecc.

Quello che puoi fare – e quello che ho fatto – è scrivere il tuo cookie in questo modo:

  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 

Aggiornare

Ho implementato questa routine perché voglio memorizzare i miei gruppi in un cookie crittografato:

 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) 

Come puoi vedere ho impostato la scadenza del cookie di autenticazione e del ticket di autenticazione con lo stesso timeout (solo se persistente).

Un’altra cosa che ho provato è quella di memorizzare nome utente e password nel cookie crittografato. Ogni volta che viene caricata una pagina master, controllo My.Profile.Current.IsAuthenticated per verificare se l’autenticazione è ancora valida. In caso contrario, leggo nuovamente il cookie, ottengo il nome utente e la password e lo controllo sul 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 è un object che ho creato per restituire nome utente e password.
CookieUserData è la memoria (ho salvato in formato json) dove ho messo la mia password e gruppi.