Domanda

Sto cercando di implementare la "Scrittura di informazioni su UserData" sezione di questo articolo , ma non funziona correttamente quando il cookie fa parte dell'URI.

Il mio codice:

// Create the cookie that contains the forms authentication ticket
HttpCookie authCookie = FormsAuthentication.GetAuthCookie( userName, createPersistantCookie );

// Get the FormsAuthenticationTicket out of the encrypted cookie
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt( authCookie.Value );

// Create a new FormsAuthenticationTicket that includes our custom User Data
FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket( ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, "foo");

// Update the authCookie's Value to use the encrypted version of newTicket
authCookie.Value = FormsAuthentication.Encrypt( newTicket );

// Manually add the authCookie to the Cookies collection
HttpContext.Current.Response.Cookies.Add( authCookie );

// Determine redirect URL and send user there
string redirUrl = FormsAuthentication.GetRedirectUrl( userName, createPersistantCookie );

HttpContext.Current.Response.Redirect( redirUrl, false );

Quando viene utilizzato il cookieless, la pagina reindirizza ma non ottiene l'URI corretto con le informazioni sui cookie al suo interno, quindi ritorna alla mia pagina di accesso dove Request.IsAuthenticated restituisce false. Segue un ciclo infinito.

Come reindirizzare all'URI corretto?

È stato utile?

Soluzione

Ho trovato che questo è un problema interessante, quindi ho iniziato a fare scavi, test e un po 'di debug nella sorgente del framework .net.

Fondamentalmente, ciò che stai cercando di fare non funzionerà. Tutto ciò che inserisci nella raccolta di Response.Cookies verrà ignorato se il browser non supporta i cookie. Puoi controllare Request.Browser.Cookies per vedere se i cookie sono supportati.

In asp.net, sia lo stato della sessione che l'autenticazione supportano una modalità senza cookie, ma ciò non si estende ad altri cookie. In effetti, sembra che la sessione e l'autenticazione possano essere impostate anche su diverse modalità operative.

Il sistema di autenticazione può memorizzare i propri dati nell'URI, ma lo fa manipolando direttamente l'URI stesso. Purtroppo, Microsoft non sembra aver esposto queste funzionalità al codice esterno al modulo di autenticazione.

In sostanza, se usi metodi come FormsAuthentication.GetAuthCookie () e FormsAuthentication.SetAuthCookie (), il sistema di autenticazione si occuperà di inserire automaticamente tali informazioni nell'URI ... ma non ti consente di fornire un ticket di autenticazione personalizzato per questi metodi ... quindi sei bloccato con il ticket di autenticazione predefinito. In questi casi, sei da solo per la memorizzazione di dati personalizzati.

In ogni caso ...

Non c'è davvero alcun vantaggio nel conservare i dati personalizzati direttamente in un ticket di autenticazione se il sistema di autenticazione è diventato senza cottura ... in modalità senza cottura, cose come "cookie persistente" non ha alcun significato, quindi rigenererai i dati almeno una volta per sessione.

Il suggerimento più comune per i casi in cui sei senza cucina ma hai ancora bisogno di dati personalizzati come questo è quello di abilitare sessioni senza cucina e archiviare i tuoi dati personalizzati come variabile di sessione. L'ID sessione verrà inserito nell'URI, ma i dati personalizzati rimarranno in memoria sul server. Il modello di utilizzo è identico, indipendentemente dal fatto che le sessioni siano senza cottura o meno.

Se lo volessi davvero, potresti trovare un sistema di archiviazione manuale dei dati personalizzati nell'URI. La cosa più semplice da fare sarebbe inserire i dati personalizzati nelle stringhe di query o utilizzare pathdata. Non riesco a vedere alcun vero vantaggio su questo rispetto alle variabili delle sessioni a meno che tu non sia solo disperato di non usare la memoria del server (l'aggiunta di un po 'di memoria a un server è economica, brutti URL e la scrittura manuale di codice per gestirli non è economica).

Altri suggerimenti

Grazie per l'ottima spiegazione, Stephen. Nei casi in cui l'utente non consente i cookie, dovrò semplicemente evitare UserData e caricare i dati dal database.

Prima del codice sopra elencato lo farò:

if( !HttpContext.Current.Request.Browser.Cookies || !FormsAuthentication.CookiesSupported )
{
    FormsAuthentication.RedirectFromLoginPage( userName, false);
    return;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top