Domanda

Dopo aver cercato un sacco non ho ricevuto alcuna risposta e alla fine ho dovuto tornare a voi. Sotto sto spiegando il mio problema in dettaglio. E 'troppo lungo, quindi si prega di non smettere di leggere. Ho spiegato il mio problema in un linguaggio semplice.

ho sviluppato un progetto mvc asp.net. Sto usando ruoli ASP.NET standard e appartenenza. Tutto sta funzionando bene, ma la funzionalità ricordati di me non funziona affatto. Sto elencando tutti i dettagli del lavoro. La speranza voi potete aiutarmi a risolvere questo problema.

Ho semplicemente bisogno di questo:

Ho bisogno all'utente di accedere all'applicazione web. Durante login possono o effettuare il login con me o senza di essa ricordare. Se utente si collega con me ricordano, voglio browser per ricordare loro per lungo tempo, diciamo atleast un anno o tempo considerevolmente lungo. Il modo in cui lo fanno in www.dotnetspider.com, www.codeproject.com, www.daniweb.com e molti altri siti. Se utente accede senza di me ricordano, quindi il browser deve consentire l'accesso al sito per circa 20 -30 minuti e dopo che la loro sessione dovrebbe scadere. La loro sessione dovrebbe anche quando scade utente accede e si spegne il browser senza disconnettersi.

Nota: ho con successo implementato sopra la funzionalità senza utilizzare i ruoli ASP.NET standard e l'appartenenza creando le mie talbes per utente e autenticazione contro la mia tabella di database, l'impostazione dei cookie e le sessioni in altri miei progetti. Ma per questo progetto a partire dall'inizio usato ruoli ASP.NET standard e di appartenenza. Abbiamo pensato che funzionerà e dopo tutto quello che è stato costruito al tempo di testare semplicemente non ha funzionato. e ora non possiamo sostituire la funzionalità esistente con ruoli ASP.NET standard e di appartenenza con le mie proprie tabelle utente personalizzate e tutte le cose, si capisce quello che sto Taling circa.

In entrambi c'è qualche tipo di bug con ruoli ASP.NET standard e funzionalità di appartenenza o ho l'intero concetto di ruoli ASP.NET standard e appartenenza storto. Ho affermato quello che voglio sopra. Penso che sia molto semplice e ragionevole.

Quello che ho fatto

  1. forma Login con username, password e ricordati di me campo.
  2. La mia impostazione nel web.config:



  3. nel mio azione di controllo, ho questo:

    FormsAuth.SignIn (username, rememberMe);

    public void SignIn (String username, bool createPersistentCookie)  {    FormsAuthentication.SetAuthCookie (userName, createPersistentCookie);  }

Ora i problemi sono i seguenti:

ho già detto nel precedente paragrafo "Ho semplicemente bisogno di questo". utente può accedere correttamente al sistema. Esiste la loro sessione per il più minuti, come specificato nel valore di timeout in web.config. Ho anche dato un campione del mio web.config. Nel mio samplem se ho impostato il timeout a 5 minuti, quindi sessione utente scade dopo 5 minuti, che è ok. Ma se l'utente chiude il browser e riaprire il browser, l'utente può comunque accedere al sito web senza loggin nel tempo fino specificato in "timeout" non ha superato fuori. La scadenza variabile per il valore di timeout sta lavorando bene. Ora, se utente accede al sistema con ricordano me controllato, sessione utente scade ancora dopo 5 minuti. Questo non è un buon comportamento, è vero ?. Voglio dire che se utente accede al sistema con ricordano me controllato che dovrebbe essere ricordato per lungo tempo fino a che non registra fuori dal sistema o utente non elimina manualmente tutti i cookie dal browser. Se utente accede al sistema senza ricordano di me controllato la sua sessione dovrebbe scadere dopo i valori di periodo di timeout specificato nel web.config e anche se gli utenti si chiude il browser. Il problema è che se l'utente chiude il browser e riapre lo può ancora accedere al sito senza effettuare il login.

Ho ricerca su Internet molto su questo argomento, ma non ho potuto ottenerela soluzione. Nel post sul blog ( http://weblogs.asp.net/ ScottGu / archive / 2005/11/08 / 430011.aspx ) fatta da Scott Gu esattamente sullo stesso argomento. Gli utenti si lamentano la stessa cosa nei loro commenti ut non esiste una soluzione facile, vista in dal signor Scott.

L'ho letto in seguito posti: http://weblogs.asp.net/scottgu/archive/2005 /11/08/430011.aspx http://geekswithblogs.net/vivek/archive/2006/09/14 /91191.aspx

Credo che questo è un problema di lotto di utenti. Come sembrare dal post di un blog realizzato da Mr. Scott Gu.

Il vostro aiuto sarà molto apprezzato. Grazie in anticipo.

È stato utile?

Soluzione

Che cosa si vuole fare è avere un timeout diverso quando l'opzione è selezionata RememberMe, rispetto a quando è incontrollato. Purtroppo, il metodo SetAuthCookie non consente di impostare manualmente la scadenza, quindi dovrete farlo da soli.

Il problema è allora, come fare?

ASP.NET MVC utilizza la classe FormsAuthentication di System.Web.Security di farlo, perché non è banale, se si desidera anche per sostenere le impostazioni di configurazione e la navigazione senza cookie e SSL, ma penso che se semplicemente fare questo:

int timeout = rememberMe ? 525600 : 30; // Timeout in minutes, 525600 = 365 days.
var ticket = new FormsAuthenticationTicket(userName, rememberMe, timeout);
string encrypted = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted);
cookie.Expires = System.DateTime.Now.AddMinutes(timeout);// Not my line
cookie.HttpOnly = true; // cookie not available in javascript.
Response.Cookies.Add(cookie);

... si otterrà una versione di base di che cosa avete bisogno.

Nota. Non ho prove di questo codice

Altri suggerimenti

Kevin e Dave, voi ragazzi roccia, l'uomo.

Dave, oltre al codice ho dovuto aggiungere una riga di più per farlo funzionare. Insomma per farla ricordare per almeno un anno. Ho dovuto assegnare il valore a cookie.Expires in aggiunta al codice per farlo funzionare. Se questa linea cookie.Expires non è impostato il cookie viene perso dopo il riavvio del computer voglio dire alla fine della sessione. Ho notato questo in FireFox. Sono andato con i dettagli di biscotto e ho trovato: se cookie.Expires non è impostato allora il valore per "Scadenza:" attributo Firefox è "Alla fine della sessione", ma se cookie.Expires è impostato il valore per "Scade :." attributo Firefox è al datetime è stato impostato il valore cookie.Expires

Ecco il codice:

int timeout = createPersistentCookie ? 525600 : 2; // Timeout in minutes,525600 = 365 days
var ticket = new FormsAuthenticationTicket(userName,createPersistentCookie,timeout);            
string encrypted = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted);
cookie.Expires = System.DateTime.Now.AddMinutes(timeout);//My Line
HttpContext.Current.Response.Cookies.Add(cookie);

Grazie ragazzi, è stato davvero una grande soluzione.

Solo una breve nota sull'utilizzo biglietto appartenenza autenticazione in un ambiente condiviso per tutti coloro che possono atterrare qui con quel problema. Ho un sito MVC runnig a GoDaddy e aveva problemi con me ricordare. Questa è stata la soluzione:

<system.web>
<machineKey
  validationKey="4C6404A3B305CD6E8CFEAC258F042FB95E45E9C3C2CEC3AAB838996CFBE661E41DF1A1BAC75B9B45E02147612FD9B71CA74DDA50B0D0D6ED11F0BB8E31048953"
  decryptionKey="BC471CF17A97B08A9DF85C7B502AD95680E3BE4418FD9C6CEA57E7F97ED64291"
  validation="SHA1" decryption="AES"
/>

Grazie a: http://www.geekfreeq.com/aspnet -Ricordarsi-me-option-forme-autenticazione-non-lavoro /

Non è un problema, è una caratteristica:)

La sessione dell'utente non è scaduto eppure così, anche se chiudere e riaprire il browser, il cookie è ancora buono.

E 'la scadenza del cookie che invalida la sessione dell'utente.

io avevo realizzato stessa cosa e quando i test si funziona bene in Mozila, ma non funziona in IE8 per tutto il pc, ho avuto anche aggiornato impostazione per accettare i cookie in IE, ma ancora non funziona.

Internet Explorer 8.x

  1. Fare clic sul Strumenti menu.
  2. Selezionare Opzioni Internet nel menu - si apre una nuova finestra.
  3. Fare clic sulla scheda Privacy nella parte superiore della finestra.
  4. Fare clic sul pulsante Default della finestra.
  5. Spostare il cursore in modo che sia su uno dei livelli al di sotto Alta Media (tra cui Media, Bassa, Accetta tutti i cookie).
  6. Salva le modifiche facendo clic su OK.
  7. Si dovrebbe essere in grado di aggiungere elementi al tuo carrello ora.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top