2009-11-04 23 views
10

Sto eseguendo il porting di un'applicazione ASP.NET su MVC e ho bisogno di memorizzare due elementi relativi a un utente autenticato: un elenco di ruoli e un elenco di ID oggetto visibile, per determinare cosa l'utente può o non può vedere.Ruoli utente - perché non memorizzare in sessione?

Abbiamo utilizzato WSE con un servizio Web in passato e questo ha reso le cose incredibilmente complesse e impossibili da eseguire correttamente il debug. Ora stiamo abbandonando il servizio web che stavo cercando di semplificare drasticamente la soluzione semplicemente per memorizzare queste cose nella sessione. Un collega ha suggerito di utilizzare i ruoli e i provider di appartenenze, ma a questo proposito ho riscontrato una serie di problemi:

a) Soffre di problemi simili ma diversi a WSE in quanto deve essere utilizzato in modo molto limitato ma è complicato persino scrivere test;

b) L'unica opzione di memorizzazione nella cache per RolesProvider si basa sui cookie che abbiamo respinto per motivi di sicurezza;

c) Non introduce alcuna complicazione e bagaglio extra indesiderato;

Tutto ciò che vogliamo fare, in poche parole, è memorizzare due variabili stringa nella sessione di un utente o qualcosa di equivalente in modo sicuro e fare riferimento a loro quando è necessario. Ciò che sembra essere un lavoro di dieci minuti ha finora preso diversi giorni di indagine e per complicare il problema che abbiamo ora scoperto che gli ID di sessione può apparentemente essere falsificati, vedere

http://blogs.sans.org/appsecstreetfighter/2009/06/14/session-attacks-and-aspnet-part-1/

sto pensando a sinistra c'è non è un modo semplice per fare questo lavoro molto semplice, ma trovo che sia impossibile da credere.

si poteva:

a) fornire informazioni semplici su come rendere le sessioni di ASP.NET MVC sicuro, come ho sempre creduto che erano?

b) suggerire un altro modo semplice per memorizzare queste due variabili stringa per i ruoli dell'utente connesso, ecc. Senza dover sostituire un incubo complesso con un altro come descritto sopra?

Grazie.

risposta

0

L'unico modo per eseguire una protezione sicura è utilizzare SSL. Qualunque cosa in meno, e devi semplicemente fare la valutazione quando è "abbastanza sicuro".

Una variabile di sessione funziona correttamente per la memorizzazione di un valore, con l'eccezione che il server Web può essere riciclato di tanto in tanto, causando la perdita della sessione. Quando ciò accade, devi autenticare nuovamente l'utente e impostare di nuovo la variabile di sessione.

La variabile di sessione stessa è completamente sicura nel senso che non lascia mai il server a meno che non lo copi specificamente in una risposta.

+0

Avrei dovuto dirlo, noi usiamo SSL quindi non ci sono problemi lì. Inoltre non abbiamo mai avuto un problema con la ricollocazione delle sessioni, quindi non sono preoccupato per questo. – Phil

+0

Come per le variabili di sessione essere completamente sicure: questo è quello che pensavo, ma l'articolo a cui mi sono collegato suggerisce che si può ingannare un utente a unirsi a una sessione esistente, in vari modi, e quindi condividerlo con l'utente autenticato che successivamente accede e quindi memorizza tutti i propri ruoli in là per essere utilizzati dall'altra persona. La soluzione ovvia a questo era di memorizzare l'indirizzo IP nella sessione e controllarlo ogni volta ma apparentemente è facile falsificarlo anche nella richiesta. Anche se non sono stato in grado di fare uno dei modi suggeriti di – Phil

+0

per partecipare a un lavoro di sessione esistente, preferirei sapere perché non si limitano a fare affidamento sulle mie carissime abilità come hacker. Se avessi fiducia in questo, penso che abbiamo risolto il problema, ma finora non lo sono. – Phil

0

Avete considerato la possibilità di impostare un tag Autorizzazione personalizzata in MVC. Ne ho fatto un esempio in un altro question.

All'autorizzazione iniziale (schermata di accesso o avvio di sessione) è possibile eseguire il seeding di un valore di sessione anche con l'indirizzo IP. Quindi, nella tua autorizzazione personalizzata, potresti anche verificare che gli IP corrispondano ancora. Ciò contribuirà ad assicurare che qualcuno non stia "rubando" la sessione della persona. Ogni volta che accedi ai tuoi dati di sessione, assicurati di passare l'IP del richiedente e di controllarlo.

0

Stai provando a controllare l'accesso alle funzioni a livello di cliente? Questa è l'unica ragione per cui esporrei i ruoli e gli elementi per controllare le funzioni lato client.

In alternativa, è possibile creare una funzione per ottenere gli elementi che i ruoli dell'utente sono autorizzati a utilizzare e, anche se la funzione viene chiamata al di fuori degli elementi restituiti all'applicazione Web, è possibile impedire all'utente dall'accedervi.

4Guys sembra mostrare come controllare le funzioni con i ruoli.

0

L'approccio che ho usato in passato è utilizzare la crittografia simmetrica di un cookie accanto a SSL. Criptare le informazioni dell'utente nella risposta e decodificarle nella richiesta. Non sto affermando che questo è infallibile o sicuro al 100% e non vorrei farlo su un'applicazione bancaria, ma è abbastanza buono per molti scopi.

Il problema principale con le variabili di sessione è che se si memorizzano inProc invece di persisterle, è necessario applicare sessioni "appiccicose" al bilanciamento del carico in un ambiente Web farm. Guffa è corretto che senza questa persistenza le variabili della sessione verranno occasionalmente perse causando un'esperienza utente scadente.

Le sessioni di appiccicose possono portare a un bilanciamento del carico non uniforme, riducendo forse il valore della scalabilità.

Se si intende mantenere le sessioni in modo che possano essere accessibili da tutti i server della propria Web farm, è preferibile utilizzare una guida per identificare l'utente, crittografarlo in un cookie e recuperare il record dell'utente. dal tuo archivio dati ogni volta.

0

La mia domanda ovvia è che perché si desidera memorizzare un ruolo utente in sessione?

Ecco la mia risposta alla tua domanda, come questo aiuta. Ho allegato una piccola applicazione demo per te per dare un'occhiata e capire i miei punti. Quando apri questo progetto in Visual Studio, fai clic sulla scheda del progetto in alto e seleziona la configurazione di asp.net. Dalla pagina che apparirà puoi fare le cose di amministrazione degli utenti.

È necessario memorizzare i ruoli di un utente in un modo sicuro? La risposta a questa domanda è che non è necessario preoccuparsi di memorizzare il ruolo per qualsiasi utente, quando abbiamo l'appartenenza di asp.net, i profili e il framework dei ruoli per aiutarci in questo. Tutto quello che devi fare è creare un ruolo nel database di ASPnet e assegnare quel ruolo all'utente.

Quindi si desidera memorizzare due stringhe in un modo sicuro. Ti suggerisco il profilo utente per la memorizzazione di informazioni specifiche dell'utente. In questo modo hai le informazioni disponibili dove vuoi dalla classe profilecommon.

Inoltre si prega di vedere l'applicazione demo allegato posto alla fine del mio blog http://blogs.bootcampedu.com/blog/post/Reply-to-httpstackoverflowcomquestions1672007user-roles-why-not-store-in-session.aspx

7

Memorizzazione delle informazioni sul ruolo dell'utente in una sessione sul lato server è sicuro che fornisce una sessione non può essere dirottato. Ripetendo questo in modo più ampio, non importa dove vengono archiviate le informazioni sui ruoli utente se una sessione autenticata viene dirottata.

Io consiglio di non fidarsi troppo dell'articolo a cui si è collegati, ma il report vintage del 2002 collegato al tuo link è interessante. Ecco i miei take-away:

  1. Non accettare ID di sessione incorporati negli URL.

  2. Concentrate il vostro tempo sull'eliminazione dei rischi di cross-site scripting, ovvero scansionate tutti i dati forniti dall'utente e analizzate lo script java eseguibile.

  3. cookie problema per i domini completi (ad esempio myapp.mydomain.com)

  4. Host tuo dominio ad un alta classe operatore di DNS per esempio uno che consente solo le modifiche DNS da un indirizzo IP remoto preimpostato.

  5. Non emettere cookie di sessione persistenti.

  6. Emettere nuovamente un cookie di sessione se si arriva a una pagina di accesso con un ID sessione già associato a una sessione autenticata.

  7. Meglio ancora, emettere sempre un nuovo cookie di sessione sull'autenticazione corretta e abbandonare la sessione precedente. (Può questo essere configurato in IIS?)

0

Solo un suggerimento, si potrebbe considerare l'utilizzo di questa piccola libreria:

http://www.codeproject.com/KB/aspnet/Univar.aspx

Si dispone di un'implementazione lato server del cookie in cui tutti i cookie può essere memorizzati sul server mentre l'autenticazione asp.net viene utilizzata per identificare l'utente. Supporta la crittografia ed è anche molto flessibile, rendendo molto facile passare da un tipo di archiviazione a un altro.

Problemi correlati