Domanda

Sono confuso sulla cache e l'autorizzazione ASP.NET MVC e ho un disperato bisogno di qualche chiarimento.

Il mio attributo di autorizzazione fatto da sé eredita da AuthorizeAttribute . Il metodo ignorato AuthorizeCore viene eseguito ogni volta, anche se imposto un attributo [OutputCache] su un'azione del controller. Capisco quella parte.

Ora la mente è per me: AuthorizeCore fallirà ogni volta che eseguo effettivamente la cache di output e la pagina viene pubblicata dalla cache. Il motivo è che quando la richiesta viene memorizzata nella cache, httpContext.Session fornito con AuthorizeCore è null !? Ecco un po 'di codice semplificato:

protected override bool AuthorizeCore(HttpContextBase httpContext) {
    return (Session["userId"] != null)
}

Quindi se httpContext.Session è null , questo ovviamente fallisce ogni volta. Devo accedere alla sessione, in quale altro modo posso verificare se la richiesta è autorizzata? Questo non ha alcun senso - se è così che dovrebbe essere mai in grado di usare le pagine memorizzate nella cache insieme all'autenticazione in ASP.NET MVC. Aiuto?

È stato utile?

Soluzione

Esistono due domande separate:

  1. L'autenticazione funziona con la memorizzazione nella cache in MVC?
  2. Session funziona prima dell'autenticazione di fronte a una cache (anche per utenti non autenticati, che hanno ancora una sessione, si spera unica)?

Le risposte, rispettivamente, sono sì e no. L'autenticazione funziona bene con la memorizzazione nella cache. Provalo con i provider di appartenenze SQL o Domain; vedrai.

La memorizzazione nella cache, tuttavia, può essere eseguita prima del modulo di autenticazione. (Per i punti bonus: perché?) L'autenticazione viene chiamata solo se si aggancia in modo specifico la cache (come fa AuthorizeAttribute). Poiché le sessioni sono specifiche dell'utente, non esiste alcuna nessuna garanzia di avere una sessione all'interno di AuthorizeCore.

Altri punti bonus: come potrebbe cambiare se si specificava VariaByUser nella configurazione della cache?

Sfortunatamente, fare l'autenticazione è difficile, perché è difficile fare qualsiasi tipo di sicurezza. Microsoft cerca di semplificarlo con l'API del provider di appartenenze. Consiglio vivamente di utilizzare tale durante l'implementazione dell'autenticazione personalizzata. Consiglio anche di utilizzare i provider integrati e di estenderli invece di riscriverli ogni volta che è possibile.

Un altro punto: il provider di sessioni ASP.NET e il provider di appartenenze ASP.NET sono interamente separati. Diversi utenti di appartenenza possono condividere (!) Una sessione e yes , puoi attacco in questo modo. È mai sicuro inserire informazioni relative alla sicurezza in una sessione. La sicurezza è difficile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top