Domanda

Voglio avere funzionalità sulla mia applicazione che consentano a un utente di verificare che desiderano rimanere registrati indefinitamente (impostando arbitrariamente la scadenza dei cookie a 3 mesi da ADESSO).

Il codice che ho per gestirlo è

private static HttpCookie GetFormsAuthenticationCookie(string userNameResponse, 
                                                        bool persistCookie)
{            
    var cookie = FormsAuthentication.GetAuthCookie(userNameResponse, persistCookie);

    if (persistCookie)
        cookie.Expires = DateTime.Now.AddMonths(3);

    return cookie;
}

private void LoginUser(string userNameResponse, bool PersistCookie)
{
    Response.Cookies.Add(GetFormsAuthenticationCookie(userNameResponse, PersistCookie));

    string navigateAfterUrl = FormsAuthentication.GetRedirectUrl(userNameResponse,
                                                                 PersistCookie);

    Response.Redirect(navigateAfterUrl);
}

Tuttavia, ad un certo punto, quando torno sul sito, devo accedere di nuovo. Ho verificato che il cookie ritorna con la mia data di scadenza e che non è impostato come cookie di sessione (testato anche con browser di chiusura / riapertura e cookie ancora esistente). Il mio unico pensiero è che abbia qualcosa a che fare con la scadenza della sessione ASP.NET.

Ho una specifica configurazione della chiave macchina nel mio web.config, quindi lo stesso cookie non dovrebbe funzionare se IIS viene riavviato, ecc.? Qualcuno ha qualche suggerimento su cosa potrebbe causare questo o almeno su come rintracciarlo ulteriormente dal momento che non riesco a pensare a nient'altro da fare.

È stato utile?

Soluzione

Quando chiami il metodo GetAuthCookie a FormsAuthenticationTicket viene creato con un timeout fornito da Timeout in web.config. Quindi assicurati di impostarlo correttamente:

<authentication mode="Forms">
  <forms
    loginUrl="/someloginUrl"
    requireSSL="true"
    protection="All"
    // This is the setting you are looking for! (it's in seconds)
    timeout="120"
    domain="example.com"
    slidingExpiration="false"
    name="cookieName" />
</authentication>

Una volta crittografato, il ticket viene utilizzato come valore per il cookie. Quando imposti la proprietà Expires del tuo cookie a un determinato valore indica che verrà persistito sul computer client per un determinato periodo. Quindi ad ogni richiesta il runtime di ASP.NET verificherà la presenza del cookie, proverà a decrittografare il valore e ottenere il ticket. Successivamente verificherà se il ticket è ancora valido utilizzando la proprietà Timeout, quindi se si dispone di un piccolo timeout, indipendentemente dal fatto che il cookie sia ancora trasmesso, il ticket non è più valido e l'autenticazione fallirà.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top