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.
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
@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