2010-05-14 5 views
6

Sono solo un nuovo arrivato in ASP.NET MVC e non sono sicuro di come ottenere un determinato compito nella "giusta direzione".ASP.NET MVC AutorizzaAttributo il passaggio di valori a ActionMethod?

In sostanza, memorizzo l'ID utente registrato in HttpContext.User.Identity e ho scritto un EnhancedAuthorizeAttribute per eseguire alcune autorizzazioni personalizzate.

Nel metodo sovrascritto OnAuthorization, il mio modello di dominio raggiunge il database per garantire che l'ID utente corrente possa accedere al routeValue "BatchCode" passato. Il prototipo è:

ReviewGroup GetReviewGroupFromBatchCode(string batchCode); 

tornerà null se l'utente non può accedere al ReviewGroup e l'OnAuthorization poi nega l'accesso.

Ora, so che il metodo di azione decorato verrà eseguito solo se passa OnAuthorization, ma non voglio colpire il database una seconda volta per ottenere nuovamente il ReviewGroup.

Sto pensando di memorizzare il gruppo di revisione in HttpContext.Items["reviewGroup"] e accedervi dal controller al momento.

È una soluzione fattibile o sono sulla strada sbagliata?

Grazie!

risposta

1

HttpContext.Items è attivo solo per la durata della richiesta. Se si vuole persistere per un tempo più lungo, si dovrebbe mettere in

a) della sessione - buona

b) profilo - non vede il vantaggio

c) cookie - non consigliato

d) colpire il database ogni volta - dovrebbe essere OK

Archiviarlo in filterContext.RouteData.DataTokens?

+0

Beh no, non ho bisogno dell'oggetto ReviewGroup per più di una singola richiesta. In realtà, tutto ciò di cui ho bisogno è passare questo oggetto (ottenuto in AuthorizeAttribute.OnAuthorization()) a ActionMethod(). –

0

A meno che tu non stia facendo una scelta MOLTO grande da ReviewGroup o disponi di un enorme database, un secondo database non sarebbe un problema. I database moderni sono molto efficienti nell'effettuare selezioni, specialmente con tabelle indicizzate correttamente.

Secondo la mia esperienza, questo è il modo migliore di eseguire l'autorizzazione e un metodo simile a come ho autorizzato azioni specifiche nelle mie applicazioni.

Quindi, in breve, non mi preoccuperei affatto del secondo hit del database.

1

In alternativa, uno dei modi migliori per evitare di colpire il database, e il più semplice, è il caching. Recuperalo, incollalo in una cache. Se è necessario nuovamente, è già in memoria e non è richiesto alcun hit DB. Altrimenti, quando la cache esce dall'ambito, anche l'oggetto.