2011-02-08 15 views
37

Quindi ci sono molti post su StackOverflow a riguardo, ma non sono ancora riuscito a risolvere il mio problema esatto. Ecco il succo:Confusione cookie con FormsAuthentication.SetAuthCookie() Metodo

Ho un sito Web che richiede l'autenticazione. Sto utilizzando il metodo standard .NET FormsAuthentication.SetAuthCookie() per mantenere la sessione dell'utente.

La mia domanda è questa: nel file web.config, è presente un attributo di timeout per il 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?

La ragione per cui 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" in realtà impostato e come posso ottenere un cookie persistente che dura un mese o un anno o più?

risposta

44

Il timeout del parametro che si è 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 si prova a controllare questo My.Profile.Current.IsAuthenticated sarà false.

È possibile 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.

Si potrebbe 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:

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

se è vero il biglietto di autenticazione si rinnoverà ogni volta che c'è attività sul tuo sito: aggiornamento della pagina, ecc

Quello che può fare - e quello che ho fatto - è quello di scrivere il proprio biscotto 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 

Aggiornamento

Ho implementato questa causa di routine voglio riporre 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 potete vedere ho impostato la scadenza del cookie di autenticazione e il ticket di autenticazione con il stesso timeout (solo se persistente).

Un'altra cosa che ho provato è memorizzare nome utente e password nel cookie crittografato. Ogni volta che viene caricata una pagina master, controllo My.Profile.Current.IsAuthenticated per vedere se l'autenticazione è ancora valida.Se non ho letto di nuovo il cookie, ottenere il nome utente e la password, e verificare 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 oggetto che ho creato per tornare username e password.
CookieUserData è la memoria (ho salvato in formato json) dove ho inserito la mia password e gruppi.

+1

ciao, mi dispiace, so che è stato troppo vecchio ma solo curioso, perché archiviarlo in formato json? la password e i gruppi. Sono molto nuovo in mvc, quindi sto ancora cercando di capire i concetti e le migliori pratiche in via di sviluppo con esso. grazie! – gdubs

+3

@gdubs: Sì, lo so. È un po 'insolito. Avrei potuto scegliere un altro formato, ma mi piace JSON. Inoltre con MVC si tende ad usare molto JSON quindi l'ho adottato come standard. – LeftyX

Problemi correlati