2012-04-17 16 views
9

Dopo aver controllato le credenziali di un utente e aver confermato che sono valide, sto utilizzando FormsAuthentication.SetAuthCookie("Username", false); per autenticare l'utente.Does FormsAuthentication.SetAuthCookie() richiede un reindirizzamento?

Nella masterpage, quindi, utilizzo Page.User.Identity.IsAuthenticated per assicurarsi che ci sia un utente che ha effettuato l'accesso e non un ospite.

Il problema sta nella prima impostazione del cookie di autenticazione. Quando imposto il cookie auth, subito dopo eseguo un metodo che utilizza Page.User.Identity.IsAuthenticated per modificare il messaggio di benvenuto da un generico "Benvenuto, ospite!" messaggio a un "Welcome, username!" più personale Messaggio. Questo non funziona finché non vado in un'altra pagina, quindi so che il processo di accesso ha funzionato, ma sembra che non possa accedere alle informazioni di cui ho bisogno fino a quando non si verifica un aggiornamento o un reindirizzamento.

Devo reindirizzare l'utente dopo aver impostato il cookie di autenticazione per utilizzare Page.User.Identity.IsAuthenticated per modificare il messaggio?

risposta

6

Ho visto questo prima quindi so che la risposta è sì. (Come in, sì, si ha bisogno di reindirizzare l'utente utilizzare correttamente Page.User.Identity.IsAuthenticated)

quello che immagino è la causa è perché IsAuthenticated valuta la richiesta di corrente, e quando la richiesta corrente prima volta in cui è stato registrato come non autenticato.

Quello che dovrete fare è applicare la logica che avete in detto metodo senza il controllo per IsAuthenicated (fatelo assumere vero).

Ora non conosco i dettagli del tuo metodo per suggerire come ridistribuirlo per far fronte a questo, ma potresti dividere la parte "Fai parte" in una funzione separata che puoi chiamare direttamente dalla tua funzione di login per bypassare il controllo dell'autenticazione.


EDIT: Per eseguire il backup la mia ipotesi è possibile read this page.

La parte interessante:

Le forniture di biglietti forme-autenticazione basata su form-autenticazione informazioni per la prossima richiesta fatta dal browser.

+0

Ah, questo in effetti sembra essere il caso, allora, grazie per la risposta! Credo che potrei semplicemente reindirizzare l'utente dopo averlo autenticato, quindi non dovrei preoccuparmi di scrivere un work-around per popolare il messaggio di benvenuto la prima volta. –

+0

@SgtBeardy: Sì, un reindirizzamento suona come una soluzione abbastanza buona per me – musefan

3

Vorrei sottolineare che c'è in realtà un modo per aggirare questo (poiché non ho mai visto questo in altre domande come questa). Puoi recuperare il cookie e i suoi dati da cui provengono le informazioni di User.Identity senza un reindirizzamento. Il fatto è che il cookie non è ancora stato inviato al browser.

Semplicemente ottiene il cookie da parte FormsAuthentication dalle Response.Cookies oggetto:

HttpCookie EncryptedCookie = Response.Cookies.Get(FormsAuthentication.FormsCookieName); 
FormsAuthenticationTicket DecryptedCookie; 
try { 
    DecryptedCookie = FormsAuthentication.Decrypt(EncryptedCookie.Value); 
} catch (ArgumentException) { 
    // Not a valid cookie 
    return false; 
} 
// DecryptedCookie.Name: The Username 
// DecryptedCookie.UserData: Any additional data, as a string. This isn't normally used 
return !DecryptedCookie.Expired; 
+0

Grazie a @Pluto hai salvato il giorno !!! È stata la tua osservazione "il cookie non è stato ancora inviato al browser" che ha fornito la svolta. –

Problemi correlati