2011-01-31 12 views
9

sto usando ASP.NET forma di autenticazione per l'accesso degli utenti in un sito web che stiamo sviluppando.Ricordami funzionalità in ASP.NET Autenticazione modulo non funziona

parte delle funzionalità è una casella di controllo "Ricordati di me", che ricorda l'utente per un mese se lo controllano.

Il codice per l'accesso l'utente è la seguente:

public static void Login(HttpResponse response, string username, 
    bool rememberMeChecked) 
{ 
    FormsAuthentication.Initialize(); 
    FormsAuthenticationTicket tkt = new FormsAuthenticationTicket(1, username, DateTime.Now, 
    DateTime.Now.AddMinutes(30), rememberMeChecked, 
    FormsAuthentication.FormsCookiePath); 
    HttpCookie ck = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(tkt)); 
    ck.Path = FormsAuthentication.FormsCookiePath; 

    if (rememberMe) 
    ck.Expires = DateTime.Now.AddMonths(1); 

    response.Cookies.Add(ck); 
} 

Il relativo capitolo nel web.config è questo:

<authentication mode="Forms"> 
    <forms loginUrl="Home.aspx" defaultUrl="~/" slidingExpiration="true" timeout="43200" /> 
</authentication> 

Questo registra la multa utente, ma li si disconnette dopo mezz'ora se non utilizzano il sito, anche se la sua proprietà di persistenza (rememberMeChecked) è impostata su true e se è true, il cookie viene impostato per scadere dopo un mese. C'è qualcosa che mi manca qui?

Grazie in anticipo, F

+1

io non sono sicuro se questo potrebbe fare la differenza in questo caso a tutti, però, cosa c'è di sbagliato con l'utilizzo di 'FormsAuthentication.RedirectFromLoginPage (username, rememberMe)'? È necessario creare manualmente il ticket? Se si specifica il timeout nella configurazione, non è necessario crearlo manualmente in codice, AFAIK. Inoltre, dove è impostato 'rememberMe'? –

risposta

0

Sembra a me che si sta controllando "rememberMe", piuttosto che la variabile che avete passato chiamato "rememberMeChecked".

1

provare a impostare l'attributo Name del tag forme nel web.config

Inoltre, Firecookie è impressionante a debug questi tipi di problemi

Proprio la lettura attraverso il codice di nuovo, hai anche specificato DateTime.Now.AddMinutes(30) nel tuo gestore di biglietti ... devi controllare se questo lo fa

+0

Il collegamento 'name' è rotto. –

+1

@TravisJ aggiornato :) – davidsleeps

0

Hai specificato DateTime.Now.AddMinutes(30) nel costruttore per FormsAuthenticationTicket. Questo è ciò che sta impostando la scadenza per il login.

6

sembra che il biglietto di autenticazione è ancora configurato per scadere dopo una mezz'ora, anche se il cookie stesso scade dopo 30 giorni. Probabilmente devi prolungare anche la durata del ticket:

public static void Login(HttpResponse response, string username, 
    bool rememberMeChecked) 
{ 
    DateTime expiration = DateTime.Now.AddMinutes(30); 
    if (rememberMe) { 
     expiration = DateTime.Now.AddMonths(1); 
    } 

    FormsAuthentication.Initialize(); 
    FormsAuthenticationTicket tkt = new FormsAuthenticationTicket(1, username, 
     DateTime.Now, expiration, rememberMeChecked, 
     FormsAuthentication.FormsCookiePath); 

    HttpCookie ck = new HttpCookie(FormsAuthentication.FormsCookieName, 
     FormsAuthentication.Encrypt(tkt)); 
    ck.Path = FormsAuthentication.FormsCookiePath; 
    response.Cookies.Add(ck); 
} 
-1

Mi sono reso conto che il biglietto di autenticazione doveva essere rinnovato, non solo letto. Il mio metodo Application_BeginRequest assomiglia a questo ora:

if (!Request.IsAuthenticated) 
    { 
    HttpCookie ck = Request.Cookies[FormsAuthentication.FormsCookieName]; 

    if (ck != null) 
    { 
     FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(ck.Value); 
     UserManagementUtils.RenewFormsAuthenticationTicket(Response, oldTicket); 
    } 
    } 

che sembra aver preso cura di esso.

+0

Questo dovrebbe essere gestito dal framework. Penso che il problema come menzionato nella risposta sopra è che non hai impostato la scadenza del ticket solo il cookie. – Justin

Problemi correlati