2009-07-19 15 views
42

Sto usando aspx e C# per un'impostazione di un cookie di autenticazione per un accesso.Memorizzazione di ulteriori informazioni utilizzando FormsAuthentication.SetAuthCookie

FormsAuthentication.SetAuthCookie(UserName, True) 

Desidero memorizzare più informazioni nello stesso cookie. Posso aggiungere valori a questo cookie di autenticazione o devo utilizzare un secondo cookie http?

Fondamentalmente sto cercando di distanza per memorizzare l'utente Id così che io possa essere in grado di accedere al database utilizzando la tabella riga di utenti chiave

Grazie, Eden

risposta

47

È possibile aggiungere i dati degli utenti al FormsAuthenticationTicket, quindi generare il cookie da soli.

C'è un esempio nello the MSDN documentation for FormsAuthenticationTicket.

EDIT

Si noti che quando si crea il biglietto, è necessario impostare il timeout, che in generale si vuole essere lo stesso valore configurato nel web.config. Sfortunatamente, in Framework 3.5 o precedenti, la classe FormsAuthentication non espone questo timeout pubblicamente. Per una soluzione alternativa, utilizzare una delle tecniche descritte nella risposta a this connect feedback item.

UPDATE

che collegano elemento positivo non c'è più, purtroppo. Vorrei aver brevemente descritto quali fossero le tecniche.

Sì, è un peccato Microsoft ha scartato gli elementi storici di Connect. IIRC, le due tecniche hanno suggerito erano:

  1. Usa WebConfigurationManager di leggere la sezione relativa configurazione e ottenere il valore di timeout.

  2. Creare un cookie utilizzando FormsAuthentication.GetAuthCookie, decodificarlo utilizzando FormsAuthentication.Decrypt e ispezionare lo FormsAuthenticationTicket generato.

Oppure l'aggiornamento a .NET 4.x in cui è presente una proprietà FormsAuthentication.Timeout.

Vedi this question per ulteriori informazioni

+0

Grazie! questo esattamente quello che stavo cercando! Sembra sovrapporsi al comportamento di FormsAuthentication.SetAuthCookie è asp.net 3.5 (non ho il tempo di usare reflector) con una sola piccola differenza. che puoi allegare dati arbitrari al cookie (non solo il nome). Grazie ancora! – Eden

+0

Che l'elemento di feedback Connect non è più lì, purtroppo. Vorrei aver brevemente descritto quali erano le tecniche ... –

+1

In .NET 4.x, il modo di utilizzare FormsAuthentication.Timeout quando si crea un nuovo ticket è simile a questo: DateTime.Now.Add (FormsAuthentication.Timeout) –

1

Passo che ID utente come username param.

FormsAuthentication.SetAuthCookie(userId, True) 

Come stai proteggendo i tuoi ticket di autenticazione?

+5

Non voglio passarlo _instead_ del nome. Vorrei aggiungere più dati allo stesso cookie di autenticazione. è possibile? – Eden

+1

@Eden hai risolto il problema Sto usando lo stesso approc ma non ho il miglior modo di memorizzare userId e ruoli nello stesso ticket? – rogue39nin

15

È possibile inserire tutto ciò che si desidera nel cookie auth finché è utile. Detto questo, se metti le informazioni sensibili dovresti, almeno, criptarlo, ma ti consiglio di non mettere informazioni sensibili lì. Si può fare qualcosa di simile:

Forms.SetAuthCookie (UserName + "|" + UserId, true); 

Poi, ogni volta che è necessario il nome utente e l'ID utente, che è lì. Basta caricare il cookie e analizzare i valori necessari.

Ancora, Vorrei sconsigliarlo, specialmente perché ho presentato sopra. Detto questo, è possibile. È necessario creare metodi di accesso per estrarre i dati di nuovo fuori:

public int CurrentUserId 
{ 
    get 
    { 
     int userId = 0; 

     if (HttpContext.Current.Request.IsAuthenticated) 
     { 
      userId = Convert.ToInt32(HttpContext.Current.User.Identity.Name.Split('|')[1]); 
     } 

     return userId; 
    } 
} 

public string CurrentUserName 
{ 
    get 
    { 
     string userName = string.Empty; 

     if (HttpContext.Current.Request.IsAuthenticated) 
     { 
      userName = HttpContext.Current.User.Identity.Name.Split('|')[0]; 
     } 

     return userName; 
    } 
} 
+0

Devo notare che il modo in cui ho presentato qui è il modo "espediente" e funzionerà, ma se dovessi farlo per avere un impatto minore sul sistema nel suo complesso, userei l'approccio che Joe ha presentato. – andymeadows

3

Si è intelligente per utilizzare "|" per mettere più informazioni. Se Microsoft ha un altro metodo sovraccarico

public static void SetAuthCookie(String userName, bool createPersistentCookie, string userData)` 

Allora la nostra vita sarà molto più facile, il nostro codice sarà più sicuro.

-1

È possibile impostare il timeout in base al valore in web.config utilizzando FormsAuthentication.Timeout.TotalMinutes.

+0

Rivisitiamo il domanda: "In sostanza, sto cercando di archiviare l'ID dell'utente in modo da poter accedere al database utilizzando il tasto della riga della tabella utenti". Questo non ha nemmeno una risposta da remoto – nathanchere

+0

Hai ragione, dovrebbe essere un commento sulla risposta principale (http://stackoverflow.com/a/1150271/1758188). In particolare, è un modo per soddisfare quanto segue: "... è necessario impostare il timeout, che in generale si desidera essere uguale al valore configurato in web.config." –

+0

@nathanchere prendi un uomo freddo. Le informazioni che forniva erano una parte critica della soluzione generale. Questo è uno dei punti deboli del modello SO, non riconosce l'importanza della discussione ausiliaria (definizione: fornire aiuto o supporto supplementare o aggiuntivo). Questo non dovrebbe essere limitato al magro sistema di commenti, che non ha formattazione del codice, ecc. –

Problemi correlati